Python:some"__魔术;属性从该函数中引用函数
Python中是否有类似PHP的Python:some"__魔术;属性从该函数中引用函数,python,python-3.x,Python,Python 3.x,Python中是否有类似PHP的\uuuu函数\uuuuu魔法常量 def func(x): print(__FUNCTION__) ## <function func at 0x00B02810> print(__FUNCTION__.__name__) ## func def func(x): 打印(函数) 打印(_函数_._名称_)##函数 UPD: 举个例子: import sys def func(f = "Foo"): b = "Bar"
\uuuu函数\uuuuu
魔法常量
def func(x):
print(__FUNCTION__) ## <function func at 0x00B02810>
print(__FUNCTION__.__name__) ## func
def func(x):
打印(函数)
打印(_函数_._名称_)##函数
UPD:
举个例子:
import sys
def func(f = "Foo"):
b = "Bar"
print(sys._getframe().f_code) ## <code object func at 0x00B09A20, file "C:\py\func.py", line 5>
print(func.__code__) ## <code object func at 0x00B09A20, file "C:\py\func.py", line 5>, the same
print(sys._getframe().f_trace) ## None
print(sys._getframe().f_locals) ## {'b': 'Bar', 'f': 'Foo'}
print(sys._getframe().f_lineno) ## 12
if __name__ == "__main__":
func()
导入系统
定义函数(f=“Foo”):
b=“巴”
打印(sys._getframe().f_code)##
打印(func.uuu code_uuu)##<在0x00B09A20处编码对象func,文件“C:\py\func.py”,第5行>,相同
打印(sys._getframe().f_trace)##无
打印(sys._getframe().f_locals)##{'b':'Bar','f':'Foo'}
打印(sys._getframe().f_lineno)#12
如果名称=“\uuuuu main\uuuuuuuu”:
func()
Python中没有任何这样的功能
您可以通过以下方式滥用以访问当前代码对象:
import sys
def foo():
print sys._getframe(0).f_code.co_name
但这将只打印最初定义的函数名。如果将foo
功能分配给另一个标识符,则上述代码将继续打印foo
:
>>> bar = foo
>>> bar()
'foo'
这就是你想要的吗
In [97]: def a():
...: print sys._getframe().f_code.co_name
...:
In [98]: a()
a
您可以使用获得部分此功能 您还可以使用
exec code
从代码对象执行代码,其中code
是在上述函数中创建的变量
请注意,
inspect.currentframe()
为您提供了与sys.\u getframe(0)
相同的对象,但它实际上是以这种方式使用的。但实际上是以这种方式使用的。否,inspect
模块为相同任务提供更友好的拼写;同样的警告也适用。+1是否有等效于获取实例名称的东西?出于兴趣,为什么要这样做?@Lattyware,在PHP中,我经常使用\uuuu函数\uuuuu
,\uu方法\uuuu
,\uu类\uuu
来创建类似smth的标志,以查看smth发生在哪个组件中。现在我学习Python并一直在测试函数修饰符,我想用同样的技术来看看调用了什么函数。+1是否有等价物来获取实例的名称?+1是否有等价物来获取实例的名称?@eyquem:这要难得多;您可以内省当前框架的code对象,以获得恰好是自定义类实例的函数的第一个参数(如果它被称为self
就更好了)。不过,这不是故障预防。谢谢。总有一天我会探索这些可能性
import inspect
def foo():
code = inspect.currentframe().f_code
print code.co_name