【问题标题】: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 以某种方式访问​​它?

【问题讨论】:

    标签: python function memory-address repr


    【解决方案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>
    

    【讨论】:

    【解决方案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 改变了它。谢谢。
        猜你喜欢
        • 2017-02-27
        • 2020-04-29
        • 2011-02-25
        • 2013-10-21
        • 1970-01-01
        • 2012-07-04
        • 2016-02-14
        • 2020-04-20
        • 2013-08-25
        相关资源
        最近更新 更多