7

とは<function at 'somewhere'>どういう意味ですか? 例:

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

を使用して何らかの方法でアクセスする方法があるかもしれません0x7f95cf42f320

4

4 に答える 4

10

関数オブジェクトのデフォルト表現を見ています。名前と一意の ID を提供します。これは、CPython ではたまたまメモリ アドレスです。

アドレスを使用してアクセスすることはできません。メモリ アドレスは、関数オブジェクトを区別するためにのみ使用されます。

つまり、元は という名前の2 つの関数オブジェクトがあるmain場合でも、それらが異なることがわかります。

>>> def main(): pass
... 
>>> foo = main
>>> def main(): pass
... 
>>> foo is main
False
>>> foo
<function main at 0x1004ca500>
>>> main
<function main at 0x1005778c0>
于 2013-10-12T11:25:29.863 に答える
3

これは関数のIDであり、CPython 実装ではメモリ内のオブジェクトのアドレスです。

于 2013-10-12T11:25:49.763 に答える
2

すべてのオブジェクトobjにはメソッドobj.__ repr __( )があります。呼び出されると、このメソッドは、オブジェクトobj
の「公式」印刷可能表現である文字列オブジェクトを返します。

Python インタープリターがスクリプト またはコマンド ラインで行に遭遇
すると、オブジェクト のメソッド__ repr __( )が呼び出され、返された代表的な文字列の値が画面に表示されます。print obj
>>> obj

オブジェクトの__ 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 内のオブジェクトの位置を参照する整数です。

0x00FB2930hexinteger、つまりメモリアドレスの値を 16 進数で表すリテラルです。

このメモリ アドレスは組み込み関数 によって正確に返されid()、その値は10 進整数リテラルとして出力されます。つまり、基数 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'>
于 2013-10-12T13:16:35.467 に答える
1

CPython では、単にメモリ内のオブジェクトのアドレスです。関数だけでなく、すべてのオブジェクトがこれを持っています。

于 2013-10-12T11:30:34.073 に答える