pisałem kod, który znajduje „metody niezwiązanych” danej klasy przy użyciu introspekcji i był zaskoczony, aby zobaczyć dwa różne rodzaje deskryptorów dla wbudowanych typów:Różnica między deskryptorami "opakowania" i "metody"?
>>> 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 okazało się bardzo ograniczony, ale ciekawe wyniki:
- A note in the inspect module że
inspect.getattr_static
nie rozwiązuje deskryptorów i zawiera kod, który może być użyty do ich rozwiązania. - an optimization made in python 2.4 twierdząc, że
method_descriptor
jest bardziej wydajny niżwrapper_descriptor
ale nie wyjaśniając, czym są:Metody
list.__getitem__()
,dict.__getitem__()
idict.__contains__()
są teraz realizowane jako method_descriptor obiekty zamiast wrapper_descriptor obiektów. Ta forma dostępu podwaja ich wydajność i czyni je bardziej odpowiednimi do użycia jako argumenty dla funkcjonałów:map(mydict.__getitem__, keylist)
.
Różnica w wydajności dość intryguje mnie, wyraźnie istnieje różnica więc poszedłem szukasz dodatkowych informacji.
Żadna z tych typów są w module types
:
>>> import types
>>> type(list.append) in vars(types).values()
False
>>> type(list.__add__) in vars(types).values()
False
wykorzystaniem help
nie dostarcza żadnej użytecznej informacji:
>>> 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 tylko wymyślił wyników „co jest deskryptor "lub niejasne odniesienia do konkretnych zaangażowanych typów.
Więc moje pytanie brzmi:
Jaka jest faktyczna różnica pomiędzy <class 'method_descriptor'>
i <class 'wrapper_descriptor'>
?
Nie ufaj "inspekcji" dotyczącej deskryptorów. Zobacz https://bugs.python.org/issue26103 (również istotna: http://stackoverflow.com/q/3798835/541136) –
@AaronHall Pomyślałem, że w tym jeden, ale nie drugi był prawdopodobnie przeoczeniem, ale nie był pewien , Powrócę do wersji, która nie wskazywała na niespójność w sprawdzanych dokumentach. –