2011-03-16 18 views
6

içinden çağrının geçerli modül/çizgiyi nasıl kontrol edileceğini:Python introspection - Bir işleve sahip fonksiyonu

# 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. 

Ben bu işlevi içe ve başka yerlerde

# 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 

cevap

13

Erişim kapatılmasının çerçeve çalıştırmak 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

traceback modülü Stac ayıklamak sağlar k, böylece mevcut yığın çerçevesine nasıl ulaştığınızı görebilirsiniz. İsterseniz siz kadarıyla istediğiniz gibi yığın yukarı, arayan-of-the arayan yazdırmak için bu uzatabilirsiniz:

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() 

Çıktı:

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

kullanın warnings modülü.

import warnings 

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

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

test('from main module') 
foo() 

Sonuçlar:

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

kontrol satır numaraları. warnings modülünü kullanmak harika çünkü modülünüzün kullanıcısı uyarıları devre dışı bırakabilir veya tamamen denetlenebilir istisnalara dönüştürebilir.