stavo scrivendo un codice che trova "metodi Unbound" di una classe utilizzando l'introspezione e sono rimasto sorpreso di vedere due diversi tipi di descrittori per i tipi built-:Differenza tra descrittori "wrapper" e "metodo"?
>>> type(list.append), list.append
(<class 'method_descriptor'>, <method 'append' of 'list' objects>)
>>> type(list.__add__), list.__add__
(<class 'wrapper_descriptor'>, <slot wrapper '__add__' of 'list' objects>)
Searching the docs alzato molto limitato, ma interessanti risultati:
- A note in the inspect module che
inspect.getattr_static
non risolve i descrittori e include un codice che può essere utilizzato per risolverli. - an optimization made in python 2.4 sostenendo che
method_descriptor
è più efficiente diwrapper_descriptor
ma non spiegando quello che sono:I metodi
list.__getitem__()
,dict.__getitem__()
, edict.__contains__()
sono ora implementato come method_descriptor oggetti piuttosto che wrapper_descriptor oggetti. Questa forma di accesso raddoppia le loro prestazioni e le rende più adatte all'utilizzo come argomenti per i funzionali:map(mydict.__getitem__, keylist)
.
La differenza di prestazioni del tutto mi ha incuriosito, chiaramente v'è una differenza così sono andato alla ricerca di ulteriori informazioni.
Nessuno di questi tipi sono nel modulo types
:
>>> import types
>>> type(list.append) in vars(types).values()
False
>>> type(list.__add__) in vars(types).values()
False
utilizzando help
non fornisce tutte le informazioni utili:
>>> help(type(list.append))
Help on class method_descriptor in module builtins:
class method_descriptor(object)
| Methods defined here:
|
<generic descriptions for>
__call__, __get__, __getattribute__, __reduce__, and __repr__
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __objclass__
|
| __text_signature__
>>> help(type(list.__add__))
Help on class wrapper_descriptor in module builtins:
class wrapper_descriptor(object)
| Methods defined here:
|
<generic descriptions for>
__call__, __get__, __getattribute__, __reduce__, and __repr__
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __objclass__
|
| __text_signature__
Searching the internet solo si avvicinò con risultati su "che cosa è un descrittore "o riferimenti vaghi ai tipi specifici coinvolti.
Quindi la mia domanda è:
Qual è la differenza reale tra <class 'method_descriptor'>
e <class 'wrapper_descriptor'>
?
Non fidatevi di 'inspect' per quanto riguarda i descrittori. Vedi https://bugs.python.org/issue26103 (anche rilevante: http://stackoverflow.com/q/3798835/541136) –
@AaronHall Ho pensato di includerne uno ma non l'altro era probabilmente una svista ma non ero sicuro , Tornerò alla versione che non ha evidenziato l'incoerenza dei documenti di ispezione. –