Как работает sys._getframe (1) .f_lineno? - PullRequest
0 голосов
/ 31 марта 2020

Я нашел этот тестовый код и запустил его с различными частями кода и нашел его правильным, но я не могу понять, как он написан и что делает эта строка кода и как он это делает:

linenum = sys._getframe(1).f_lineno

Может кто-нибудь, пожалуйста, скажите мне, как работает вышеуказанная строка кода? Полный блок кода:

import sys

def test(did_pass):
    """  Print the result of a test.  """
    linenum = sys._getframe(1).f_lineno   # Get the caller's line number.
    if did_pass:
        msg = "Test at line {0} ok.".format(linenum)
    else:
        msg = ("Test at line {0} FAILED.".format(linenum))
    print(msg)

1 Ответ

0 голосов
/ 31 марта 2020

Показывает номера строк функций в стеке вызовов.

Например,

import sys

def f1():
    f2()    # First call in the stack

def f2():
    f3()    # Second call in the stack

def f3():
    for num in range(3):
        frame = sys._getframe(num)
        show_frame(num, frame)  # Third call in the stack

def show_frame(num, frame):
    print(frame)
    print("  frame     = sys._getframe(%s)" % num)
    print("  function  = %s()" % frame.f_code.co_name)    # Shows the function/module name
    print("  file/line = %s:%s" % (frame.f_code.co_filename, frame.f_lineno))   # Shows the stack line number it was called in

f1()

Вывод приведенного выше списка выглядит следующим образом:

<frame at 0x101172dc0, file 'temp.py', line 12, code f3>
  frame     = sys._getframe(0)
  function  = f3()
  file/line = temp.py:12
<frame at 0x101184200, file 'temp.py', line 7, code f2>
  frame     = sys._getframe(1)
  function  = f2()
  file/line = temp.py:7
<frame at 0x1011f29f0, file 'temp.py', line 4, code f1>
  frame     = sys._getframe(2)
  function  = f1()
  file/line = temp.py:4

Просто проверьте корреляцию с номерами строк и вызовами функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...