2009-05-22 10 views
74

sizin gibi 2 işlevleri varsa:Arayanın işlev adını Python'da başka bir işlevin içine mi almak istiyorsunuz?

def A() : 
    B() 

def B() : 
    this.caller.name 
+1

Kaynağa sahipsiniz. Neden böyle bir şeye ihtiyacın var? –

+12

Çünkü bir üçüncü parti uygulamasının python yorumlayıcısında kodun hatalarını ayıklarken gerçek bir hata ayıklayıcısı yok. –

+3

olası kopyası [Python: Arayanın yöntem adı aranan yöntemde nasıl alınır?] (Http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in python 3.4 üzerinde – bernie

cevap

103

Sen çağrı almak için inspect modülünü kullanabilirsiniz:

def A 
def B 

ve A B çağırır, Kim gibi, B içindeki B aradığını alabilirsiniz yığını. Çerçeve kayıtlarının bir listesini döndürür. Her kayıttaki üçüncü öğe arayan adıdır. İstediğiniz şey şudur: Elbette

>>> import inspect 
>>> def f(): 
...  print inspect.stack()[1][3] 
... 
>>> def g(): 
...  f() 
... 
>>> g() 
g 

, belirli bir dizin erişmeyi denemeden önce kayıtlarının bulunduğunu yeterli çerçeveyi kontrol etmek için iyi bir fikirdir. Aşağıdaki örnekte olduğu gibi

+6

-denilen-yöntem-en azından bu işe yaramaz, onlar tuples sırasını değiştirdi. Şimdi adlandırılmış bir tuple kullanılıyor, bu yüzden inspect.stack() [1] .filename – timeyyy

8

:

>>> def foo(): 
... global x 
... x = sys._getframe(1) 
... 
>>> def y(): foo() 
... 
>>> y() 
>>> x.f_code.co_name 
'y' 
>>> 

Önemli not: Bu _getframe yöntem adı (hey, bir alt çizgi ile başlar) den açıktır olarak, bir API yöntemi değil bir düşüncesizce güvenmek olmalı . Baseconfig() içinde

+9

[sys._getframe] kullanmak en iyisidir (http://docs.python.org/library/sys.html#sys._getframe) "Python'un tüm uygulamalarında mevcut olduğu garanti edilmez" - Bence bunun önemli olduğunu düşünüyorum. – RWS

+0

@RWS, teşekkürler, not –

2

kullanıcı günlük modülü ve% (dosya adı) belirtebilirsiniz s seçeneği

import logging 
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s') 

def A(): 
    logging.info('info') 
+1

Dikkatle "% (dosya adı) seçeneği" deyin. Kod örneğinizde sahip olduğunuz şey olmalı: '% (funcName) s' :) –

10

sys kullanılarak iki yol ve inspect modül vardır:

  • inspect.stack()[1][3]

stack() formu daha az okunabilir ve inspect.py gelen özü, bkz sys._getframe() çağırır beri uygulama bağlıdır:

def stack(context=1): 
    """Return a list of records for the stack above the caller's frame.""" 
    return getouterframes(sys._getframe(1), context) 
4

Bu benim için çalışıyor! : D

>>> def a(): 
...  import sys 
...  print sys._getframe(1).f_code.co_name 
... 
>>> def b(): 
...  a() 
... 
... 
>>> b() 
b 
>>> 
İlgili konular