我試圖寫一個函數調試裝飾器將着眼於內的字符串:解析蟒蛇作爲裝飾
def foo(baz):
bar = 1
bar = 2
return bar
,並換到:
def foo(baz):
bar = 1
print 'bar: {}'.format(bar)
bar = 2
print 'bar: {}'.format(bar)
return bar
我需要與打函數作爲文本來抓取「\ w +(?= \ s * [=])」,但不知道如何訪問它。我有一個裝飾,我從一個可行的博客修改,但我只是想將其更改爲:
class decorator_string_check(object):
def __init__(self, func):
self.func = func
wraps(func)(self)
def __call__(self, *args, **kwargs):
print dir(self.func)
print dir(self.func.__code__)
print self.func.__code__.__str__()
ret = self.func(*args, **kwargs)
return ret
@decorator_string_check
def fake(x):
y = 6
y = x
return y
y = fake(9)
和我得到的價值nothinng,即:
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
<code object fake at 0x7f98b8b1d030, file "./logging.py", line 48>
如何與實際工作「func」文本,運行正則表達式並找到我需要的裝飾類對象中的東西?謝謝
其實都一個理智的解決方案(不只是一個「更理智」)是使用Python調試工具-with'sys.settrace',並有效地編寫自定義調試器,將每行後局部變量的值進行比較,並打印不同的內容 - 在裝飾代碼的持續時間內提供一個能夠提供'settrace'的裝飾器並不困難。 – jsbueno
@jsbueno你說得對。我不知道這件事,它*看起來是做這種事的唯一正確方式。我已將它添加到我的答案中。 – Bakuriu
@Bakuriu doumo arigatou gozaimasu ... anata wa watashi yori mo kashikoku miemasu :) 我想跟蹤所有/每個變量的分配,只是爲了確切知道變量在那個時間點。這樣我可以裝飾一些不起作用的東西,而不是1238234打印語句方法。我相信整個世界都可以使用我們的裝飾器 – codyc4321