Что в Python означает «функция в ...»?

python function memory-address repr

8382 просмотра

4 ответа

Что <function at 'somewhere'>значит? Пример:

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

А может есть способ как-то получить к нему доступ с помощью 0x7f95cf42f320?

Автор: JadedTuna Источник Размещён: 12.11.2019 09:39

Ответы (4)


10 плюса

Решение

Вы смотрите на представление по умолчанию функционального объекта. Он предоставляет вам имя и уникальный идентификатор, который в CPython случается быть адресом памяти.

Вы не можете получить к нему доступ по адресу; адрес памяти используется только для того, чтобы помочь вам различать функциональные объекты.

Другими словами, если у вас есть два функциональных объекта, которые были изначально названы main, вы все равно можете увидеть, что они разные:

>>> def main(): pass
... 
>>> foo = main
>>> def main(): pass
... 
>>> foo is main
False
>>> foo
<function main at 0x1004ca500>
>>> main
<function main at 0x1005778c0>
Автор: Martijn Pieters Размещён: 12.10.2013 11:25

3 плюса

Это идентификатор функции , в реализации CPython это адрес объекта в памяти.

Автор: aga Размещён: 12.10.2013 11:25

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'>
Автор: eyquem Размещён: 12.10.2013 01:16

1 плюс

В CPython это просто адрес объекта в памяти. Все объекты имеют это, не только функции.

Автор: Games Brainiac Размещён: 12.10.2013 11:30
Вопросы из категории :
32x32