我有一個Python裝飾器,我用它來標記函數/方法爲廢棄。它工作足夠,但我想它的工作更好。具體來說,我想要它做的是能夠告訴確切的行號到棄用函數。這樣就不需要通過源代碼來查找它;相反,警告將直接指向它。 (這並不是說有人不會通過代碼grep來尋找其他地方使用調用已棄用的函數,但他們不應該這樣做,以響應這樣的警告,恕我直言)。獲取有關在Python裝飾器中調用代碼的具體信息
class deprecated(object):
'''This class implements the deprecated decorator.
This decorator is used to mark a function or a class as
deprecated. A message indicating why it is deprecated (and what
to use instead) must be provided. Also, a version number
indicating when the function or class was deprecated must _also_
be provided.
Optionally, a third parameter may be passed that indicates when
the deprecated functionality will actually be removed.'''
def __init__(self, message, version, to_be_removed_in_version = None):
self._message = message
self._version = version
self._removal_version = to_be_removed_in_version
return
def __call__(self, func):
def wrapper(*args, **kwargs):
import warnings
import inspect
frame = inspect.currentframe().f_back
where = 'Called from {0} somewhere after line {1}.'
where = where.format(frame.f_code.co_filename,
frame.f_code.co_firstlineno)
msg = 'Call to deprecated function {0} (since {1}{2}) {3}'
if self._removal_version is not None:
removal = ', scheduled for removal by version {0}'
removal = removal.format(self._removal_version)
msg = msg.format(func.__name__, self._version,
removal, where)
warnings.warn_explicit(msg, category = DeprecationWarning,
filename = func.func_code.co_filename,
lineno = func.func_code.co_firstlineno + 1)
return func(*args, **kwargs)
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
wrapper.__dict__.update(func.__dict__)
return wrapper
co_firstlineno現在給你什麼?你可以使用模塊檢查來增加堆棧到函數被調用的地方嗎?一旦你到了正確的框架,f_lineno應該告訴你你想要什麼 - 雖然我從來沒有用過裝飾者之前... – 2011-02-15 01:41:33