如何打印每个功能/方法调用?
我试图使用:if let image = UIImage(named: "example.png") {
if let data = UIImagePNGRepresentation(image) {
let filename = getDocumentsDirectory().appendingPathComponent("copy.png")
try? data.write(to: filename)
}
}
但它也打印函数内部代码...我只想要调用的函数名称。
在代码中使用traceback打印在调用命令本身之前调用的最后一个函数,代码包含许多类...
答案 0 :(得分:4)
您可能会发现-l
有用。
main.py:
def foo():
pass
def bar():
pass
foo()
bar()
否则
$ python -m trace -l main.py
输出
functions called:
filename: C:\Python34\lib\trace.py, modulename: trace, funcname: _unsettrace
filename: main.py, modulename: main, funcname: <module>
filename: main.py, modulename: main, funcname: bar
filename: main.py, modulename: main, funcname: foo
根据您拥有的功能数量,您可能会发现装饰器更合适:
def print_deco(func):
def inner(*args, **kwargs):
print(func.__name__)
return func(*args, **kwargs)
return inner
@print_deco
def foo():
pass
@print_deco
def bar():
pass
foo()
bar()
# foo
# bar
答案 1 :(得分:1)
这里是名为player.py
的代码。
# player.py
def foo():
pass
def bar():
foo()
def car():
bar()
pass
car()
从终端执行命令,如$python -m trace -T player.py
,它给出了以下输出。对于相同的输出,您也可以使用--trackcalls
代替-T
。该命令显示通过运行程序公开的调用关系。
calling relationships:
*** /usr/lib/python2.7/trace.py ***
trace.Trace.runctx -> trace._unsettrace
--> player.py
trace.Trace.runctx -> player.<module>
*** player.py ***
player.<module> -> player.car
player.bar -> player.foo
player.car -> player.bar
希望这会有所帮助。
更新1:
以上命令显示函数的关系。
为了跟踪该功能,我们可以使用traceback
模块。在此模块中traceback.print_stack()
根据执行情况打印函数。但是我们必须记住,在我们编写traceback.print_stack()
的方法中,它只会打印该函数的跟踪。我会举个例子。
import traceback
def foo():
car()
pass
def bar():
foo()
def car():
traceback.print_stack()
pass
bar()
如果我们运行它,我们可以看到以下输出。
File "D:/python_practice36/player.py", line 10, in <module>
bar()
File "D:/python_practice36/player.py", line 6, in bar
foo()
File "D:/python_practice36/player.py", line 3, in foo
car()
File "D:/python_practice36/player.py", line 8, in car
traceback.print_stack()
如果我们在traceback.print_stack()
中调用foo()
,那么我们可以看到追溯到foo
。
import traceback
def foo():
car()
traceback.print_stack()
pass
def bar():
foo()
def car():
pass
bar()
,输出
File "D:/python_practice36/player.py", line 10, in <module>
bar()
File "D:/python_practice36/player.py", line 7, in bar
foo()
File "D:/python_practice36/player.py", line 4, in foo
traceback.print_stack()