2010-03-27 14 views
8

Geçerli işlev olarak adlandırılan işlevi bulmanın bir yolu var mı? Örneğin, örneğin:Üst işlevi alma

Herhangi bir fikir?

+4

@MikeG .: üretim açıklamasında bu bilgi, evet kötü istemek. Büyük bir Python parçasını ayıklamak ve anlamak için kullanmak gayet iyi, IMHO. –

cevap

7
import inspect 

def first(): 
    return second() 

def second(): 
    return inspect.getouterframes(inspect.currentframe())[1] 

first()[3] # 'first' 
2

Geri tepme modülünün extract_stack işlevini kullanabilirsiniz.

import traceback 
def first(): 
    second() 

def second(): 
    print traceback.extract_stack(limit=2)[-2][2] 
2

inspect modül bu da dahil içgözlem birçok formları için izin verir, ancak yalnızca değil üretim kodun işlevlerinin bir parçası olarak, ayıklama gibi amaçlarla bu bilgileri kullanmanız önerilir unutmayın. Tüm ayrıntılar için bkz. the docs.

1

Bu, başka bir modülü almak istemediğinizde en az nerede-ben-I hata ayıklama yardımcılarını hızla eklemek için iyi çalışır. (CPython sadece sadece hata ayıklama için.)

def LINE(back = 0): 
    return sys._getframe(back + 1).f_lineno 
def FILE(back = 0): 
    return sys._getframe(back + 1).f_code.co_filename 
def FUNC(back = 0): 
    return sys._getframe(back + 1).f_code.co_name 
def WHERE(back = 0): 
    frame = sys._getframe(back + 1) 
    return "%s/%s %s()" % (os.path.basename(frame.f_code.co_filename), 
          frame.f_lineno, frame.f_code.co_name) 

Örnek:

import sys, os # these you almost always have... 

def WHERE(back = 0): 
    frame = sys._getframe(back + 1) 
    return "%s/%s %s()" % (os.path.basename(frame.f_code.co_filename), 
         frame.f_lineno, frame.f_code.co_name) 

def first(): 
    second() 

def second(): 
    print WHERE() 
    print WHERE(1) 

first() 

Çıktı:

$ python fs.py 
fs.py/12 second() 
fs.py/9 first() 
İlgili konular