Відповіді:
Завдяки mcandre відповідь така:
#python3
from inspect import currentframe, getframeinfo
frameinfo = getframeinfo(currentframe())
print(frameinfo.filename, frameinfo.lineno)
import inspect inspect.getframeinfo(inspect.currentframe()).lineno
currentframe()
викликається, це означає, що ви більше не можете спростити це getframeinfo(currentframe()).lineno
(якщо ви дбаєте лише про номер рядка, а не назву файлу). Дивіться docs.python.org/2/library/inspect.html#inspect.currentframe
Чи буде ви використовувати, currentframe().f_back
залежить від того, використовуєте ви функцію чи ні.
Виклик інспекції безпосередньо:
from inspect import currentframe, getframeinfo
cf = currentframe()
filename = getframeinfo(cf).filename
print "This is line 5, python says line ", cf.f_lineno
print "The filename is ", filename
Виклик функції, яка робить це для вас:
from inspect import currentframe
def get_linenumber():
cf = currentframe()
return cf.f_back.f_lineno
print "This is line 7, python says line ", get_linenumber()
Зручно, якщо використовується в загальному файлі - друкує ім'я файлу, номер рядка та функції абонента:
import inspect
def getLineInfo():
print(inspect.stack()[1][1],":",inspect.stack()[1][2],":",
inspect.stack()[1][3])
Ім'я файлу :
__file__
# or
sys.argv[0]
Рядок :
inspect.currentframe().f_lineno
(не inspect.currentframe().f_back.f_lineno
як зазначено вище)
NameError: global name '__file__' is not defined
на моєму інтерпретатора: Python 2.7.6 (default, Sep 26 2014, 15:59:23)
. Див stackoverflow.com/questions/9271464 / ...
Краще також використовувати sys-
print dir(sys._getframe())
print dir(sys._getframe().f_lineno)
print sys._getframe().f_lineno
Вихід:
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
14
Просто зробити внесок,
є linecache
модуль у python, ось два посилання, які можуть допомогти.
документація модуля
linecache вихідного коду
У певному сенсі ви можете "скинути" цілий файл у його кеш і прочитати його з даними linecache.cache з класу.
import linecache as allLines
## have in mind that fileName in linecache behaves as any other open statement, you will need a path to a file if file is not in the same directory as script
linesList = allLines.updatechache( fileName ,None)
for i,x in enumerate(lineslist): print(i,x) #prints the line number and content
#or for more info
print(line.cache)
#or you need a specific line
specLine = allLines.getline(fileName,numbOfLine)
#returns a textual line from that number of line
Для отримання додаткової інформації для керування помилками ви можете просто скористатися
from sys import exc_info
try:
raise YourError # or some other error
except Exception:
print(exc_info() )
import inspect
file_name = __FILE__
current_line_no = inspect.stack()[0][2]
current_function_name = inspect.stack()[0][3]
#Try printing inspect.stack() you can see current stack and pick whatever you want
__file__
: Див stackoverflow.com/questions/3056048 / ...
У Python 3 ви можете використовувати варіацію на:
def Deb(msg = None):
print(f"Debug {sys._getframe().f_back.f_lineno}: {msg if msg is not None else ''}")
У коді ви можете використовувати:
Deb("Some useful information")
Deb()
Виробляти:
123: Some useful information
124:
Де 123 і 124 - лінії, з яких здійснюються дзвінки.
Ось що для мене працює, щоб отримати номер рядка в Python 3.7.3 в VSCode 1.39.2 ( dmsg
це мінемонічне повідомлення про налагодження):
import inspect
def dmsg(text_s):
print (str(inspect.currentframe().f_back.f_lineno) + '| ' + text_s)
Щоб викликати показ змінної name_s
та її значення:
name_s = put_code_here
dmsg('name_s: ' + name_s)
Вихід виглядає приблизно так:
37| name_s: value_of_variable_at_line_37