Python introspection - как проверить текущий модуль / строку вызова изнутри функции - PullRequest
6 голосов
/ 16 марта 2011

У меня есть функция:

# utils.py
def hello(name='World'):
    # Detect where I'm being called from.
    print('Hi, %s. You called this from %s at line # %d.' % (name, mod, lineno))
    # ``mod`` and ``lineno`` on previous line would have been set in real use.

Я импортирую эту функцию и запускаю ее в другом месте

# other.py (this comment at line # 138)
from utils import hello
hello('Johnny')  # From inside ``hello`` I want to be able to detect that this
# was called from other.py at line # 140

Ответы [ 3 ]

13 голосов
/ 16 марта 2011

Доступ к раме inspect.currentframe():

import inspect

def hello(name='World'):
    f = inspect.currentframe().f_back
    mod = f.f_code.co_filename
    lineno = f.f_lineno
    print('Hi, %s. You called this from %s at line # %d.' %
          (name, mod, lineno))
3 голосов
/ 16 марта 2011

Модуль traceback позволяет вам извлечь стек, чтобы вы могли видеть, как вы достигли текущего кадра стека. Если вы хотите, вы можете расширить это так, чтобы печатать вызывающего абонента, до нужного вам стека:

import traceback

def _trace():
    stack = traceback.extract_stack()[-3:-1]
    path, line, in_func, _instr = stack[0]
    print 'called from %s in func %s at line %s' % (path, in_func, line)

def bar():
    _trace()

def foo():
    bar()
    baz()

def baz():
    bar()

bar()
foo()

Выход:

called from hello.py in func <module> at line 20
called from hello.py in func foo at line 14
called from hello.py in func baz at line 18
1 голос
/ 01 декабря 2011

Используйте модуль warnings.

import warnings

def test(where):
    warnings.warn('hi from test', stacklevel=2)

def foo():
    test('inside foo')

test('from main module')
foo()

Результаты:

/tmp/test.py:9: UserWarning: hi from test
  test('from main module')
/tmp/test.py:7: UserWarning: hi from test
  test('inside foo')

Проверьте номера строк.Использование модуля warnings прекрасно, потому что пользователь вашего модуля может отключить предупреждения или превратить их в полностью проверяемые исключения.

...