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

10
什么是 <function at 'somewhere'> 的意思?例如:
>>> def main():
...     pass
...
>>> main
<function main at 0x7f95cf42f320>

也许有一种方法可以使用 0x7f95cf42f320 访问它?
4个回答

11
您正在查看函数对象的默认表示。它提供了一个名称和一个唯一的id,在CPython中,这个id恰好是一个内存地址。
您不能使用该地址访问函数对象;内存地址仅用于帮助您区分函数对象。
换句话说,如果您有两个最初命名为“main”的函数对象,您仍然可以看到它们是不同的:
>>> def main(): pass
... 
>>> foo = main
>>> def main(): pass
... 
>>> foo is main
False
>>> foo
<function main at 0x1004ca500>
>>> main
<function main at 0x1005778c0>

@Vik2015 不是,参见https://dev59.com/CXM_5IYBdhLWcg3wZSM6。 - user395760

3

这个函数是用来获取对象的标识符,在CPython实现中,它代表了对象在内存中的地址。


2
每个对象obj都有一个方法obj.__repr__( )
当调用该方法时,它返回一个字符串对象,该对象是对象obj的“官方”可打印表示形式。
当Python解释器在脚本中遇到一行print obj或在命令行中遇到>>> 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'>

.

<function main at 0x00FB2930>中,部分0x00FB2930表示对象(这里是函数)的内存地址,也就是一个整数,它引用了RAM中对象的位置。 0x00FB2930是一个十六进制整数,也就是一个字面上表示内存地址值的16进制数字。
这个内存地址恰好由内置函数id()返回,它的值被打印为十进制整数字面量,也就是它在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'>

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

这仅适用于CPython。 - Livius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接