在 Python 中,'<function at ...>' 是啥意思?

Posted

技术标签:

【中文标题】在 Python 中,\'<function at ...>\' 是啥意思?【英文标题】:In Python, what does '<function at ...>' mean?在 Python 中,'<function at ...>' 是什么意思? 【发布时间】:2013-10-20 10:42:38 【问题描述】:

&lt;function at 'somewhere'&gt; 是什么意思?示例:

>>> def main():
...     pass
...
>>> main
<function main at 0x7f95cf42f320>

也许有一种方法可以使用 0x7f95cf42f320 以某种方式访问​​它?

【问题讨论】:

【参考方案1】:

您正在查看函数对象的默认表示。它为您提供了一个名称和一个唯一的 id,在 CPython 中 恰好 是一个内存地址。

您无法使用该地址访问它;内存地址只是用来帮助你区分函数对象。

换句话说,如果你有两个函数对象,它们最初被命名为main,你仍然可以看到它们是不同的:

>>> def main(): pass
... 
>>> foo = main
>>> def main(): pass
... 
>>> foo is main
False
>>> foo
<function main at 0x1004ca500>
>>> main
<function main at 0x1005778c0>

【讨论】:

@Vik2015 不,见http://***.com/q/1396668/395760【参考方案2】:

是函数的identity,在CPython实现中是对象在内存中的地址。

【讨论】:

【参考方案3】:

每个对象obj都有一个方法obj.__repr__( ) 调用时,此方法返回一个字符串对象,它是对象 obj

的“官方”可打印表示

当Python解释器遇到 脚本中的一行print obj&gt;&gt;&gt; obj 在命令行中, 对象的方法__repr__( )被调用,返回的代表字符串的值显示在屏幕上。

对象的__repr__( )方法可以具体调用,使用内置函数repr( ),以对象名作为参数,赋值给__repr__( ) 返回的字符串到一个标识符,因此能够对此表示执行操作。 仅在 Python 1 和 Python 2 中,对象名称周围的反引号与在其上调用 repr( ) 具有相同的效果。

比较:

def main():
    pass

if  '__repr__' in  dir(main):
    print ('__repr__ is a method  of main\n')
else:
     print ('main has no method __repr__\n')

print ('main : %s\n'
       'type(main) == %s\n'
       % (main,type(main)) )

print ('repr(main) : %s\n'
       'type(repr(main)) == %s'
       %(repr(main),type(repr(main))) )

# Only in Python 1 and Python 2, string conversions with
# reversed quotes produce the same result as repr():
print ('\n`main` : %s\n'
       'type(`main`) == %s'
       % (`main`,type(`main`)) )

结果

__repr__ is a method  of main

main : <function main at 0x00FB2930>
type(main) == <type 'function'>

repr(main) : <function main at 0x00FB2930>
type(repr(main)) == <type 'str'>

.

&lt;function main at 0x00FB2930&gt;中,0x00FB2930部分代表对象(这里是函数)的内存地址,也就是引用该位置的整数 RAM 中的对象。

0x00FB2930 是一个hexinteger,也就是说一个以 16 为基数的表示内存地址值的文字。

这个内存地址由内置函数id()精确返回,其值被打印为decimalinteger字面量,即以10为底的表示。

print ('repr(main) : %s\n'
       'type(repr(main)) == %s\n'
       % (repr(main),
          type(repr(main))) )

hex_address = repr(main)[18:-1]
print ('hex_address = repr(main)[18:-1]  defined\n'
       'hex_address : %s\n'
       'type(hex_address) == %s\n'
       'int(hex_address , 16) : %s\n'
       'type(int(hex_address , 16)) : %s\n'
       % (hex_address,
          type(hex_address),
          int(hex_address , 16),
          type(int(hex_address , 16))) )

print ('id(main) : %s\n'
       'type(id(main)) == %s\n'
       'hex(id(main) : %s\n'
       'type(hex(id(main)) : %s'
       % (id(main),
          type(id(main)),
          hex(id(main)),
          type(hex(id(main)))) )

结果

repr(main) : <function main at 0x00FB2930>
type(repr(main)) == <type 'str'>

hex_address = repr(main)[18:-1]  defined
hex_address : 0x00FB2930
type(hex_address) == <type 'str'>
int(hex_address , 16) : 16460080
type(int(hex_address , 16)) : <type 'int'>

id(main) : 16460080
type(id(main)) == <type 'int'>
hex(id(main) : 0xfb2930
type(hex(id(main)) : <type 'str'>

【讨论】:

【参考方案4】:

在 CPython 中只是对象在内存中的地址。所有对象都有这个,不仅仅是函数。

【讨论】:

这仅适用于 CPython。 @Livius 改变了它。谢谢。

以上是关于在 Python 中,'<function at ...>' 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Python 多处理 PicklingError:无法腌制 <type 'function'>

Python多处理PicklingError:无法腌制<type'function'>

如何使用 pybind11 将 python 函数转换为 std::function

'function'对象在本地包中不可订阅

python编程小问题,求问

为啥我们在导入 print_function 后调用 print(在 Python 2.6 中)