Vraag Wat betekent "dict-like" in Python?


Af en toe verwijzen mensen naar 'X-achtige' objecten in Python. Voorbeeld:

data_iter_maker - Een callable op nul-argument die een iterator retourneert over dict-like data-objecten.

Heeft "dict-like" een nauwkeurige definitie, en zo ja, wat is het? Zou het een object zijn x die kan worden geïndexeerd zoals een woordenboek kan: x[a], waar a is een hashable? In dat geval wordt een naamdeeltje misschien niet als dictaat beschouwd, omdat je niet kunt indexeren met een expressie zoals x['a'] (voor het laatst heb ik gecontroleerd dat je moet schrijven x.a). Maar aan de andere kant zijn namedtuples functioneel zo vergelijkbaar met dictaten dat ik niet zeker weet wat ik moet denken.

Cynisch gezien, ben ik in de verleiding om te raden dat "dict-like" betekent "een object vergelijkbaar genoeg om te dicteren dat mijn code hetzelfde antwoord zal produceren alsof je een semantisch equivalent dict-object had ingediend". Met andere woorden: "voer de functie uit en ontdek zelf of uw argument dictaatachtig is!"

Meer in het algemeen, is een X-achtig object een die dezelfde interface implementeert als X?


12
2017-11-21 16:11


oorsprong


antwoorden:


Python gebruikt 'duck-typing':

"Als het op een eend lijkt en kwaakt als een eend, moet het een eend zijn."

Of misschien: "Als het op een eend lijkt en kwaakt als een eend, is het voldoende dicht bij een eend om het als een eend te behandelen." Natuurlijk klinkt het eerste beter. Dit hangt nauw samen met de pythonleer van "Gemakkelijker om vergeving te vragen dan om toestemming te vragen".

EEN dict-like object is een die de woordenboekinterface implementeert (of emuleert).  De hetzelfde concept komt vaak voor iterables, en vaak in numpy voor 'array-like' (of 'array_like') objecten.


7
2017-11-21 16:48



Praktisch typen met eenden:

dict_meths = set(dir({}))

# Python3
class A:
    pass

default_meths = set(dir(A()))

diff = dict_meths - default_meths

Nu diff is:

{'__contains__',
 '__delitem__',
 '__getitem__',
 '__iter__',
 '__len__',
 '__setitem__',
 'clear',
 'copy',
 'fromkeys',
 'get',
 'items',
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values'}

Wanneer je al deze methoden in je klas implementeert, heb je zeker een dict-like object. Als sommige van de minder voorkomende zoals update missen, je kunt nog steeds praten over een dict-achtig object. Vergelijken bestand-achtige objecten.


5
2017-11-21 16:53