Mam nazwaną klasę krotki w Pythonie
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Chciałbym zamienić instancje Town na słowniki. Nie chcę, aby było to sztywno związane z nazwami lub liczbą pól w mieście.
Czy istnieje sposób na zapisanie go w taki sposób, że mógłbym dodać więcej pól lub przekazać zupełnie inną nazwaną krotkę i uzyskać słownik.
Nie mogę zmienić oryginalnej definicji klasy, ponieważ znajduje się w czyimś kodzie. Muszę więc pobrać wystąpienie Town i przekonwertować je na słownik.
python
dictionary
tuples
namedtuple
Beze mnie to tylko aweso
źródło
źródło
dir
polecenie, które pokaże pola dla dowolnego obiektu ... który_asdict
bezpośrednio pokazałby funkcję.dict
zamiast „namedtuple” i przekazanie namedtuple do inicjatora. Pamiętaj, że jeśli jesteś przyzwyczajony do Cxx,class Town(x)
to nie konstruktor, ale wdef __init__(self, *args, **kwargs)
środku jest.dir
jest po prostu wbudowanym pythonem ... możesz go uruchomić na dowolnym obiekcie Pythona, w konsoli lub w skrypcie (gdzie zwraca listę, którą możesz wydrukować lub zrobić cokolwiek), a zwróci listę (prawie ) wszystkie atrybuty obiektu. przydatne, jeśli próbujesz dowiedzieć się, jak działa nieznany obiekt.Odpowiedzi:
TL; DR: istnieje na to metoda
_asdict
.Oto demonstracja użycia:
Jest to udokumentowana metoda namedtuples, tj. W przeciwieństwie do zwykłej konwencji w Pythonie, wiodący znak podkreślenia w nazwie metody nie ma zniechęcać do używania . Wraz z innymi metodami dodawanych do namedtuples,
_make
,_replace
,_source
,_fields
, ma podkreślenia tylko spróbować i uniknąć ewentualnych konfliktów z nazwami pól.Uwaga: w przypadku kodu 2.7.5 <python w wersji <3.5.0 na wolności możesz zobaczyć tę wersję:
Przez chwilę dokumentacja wspominała, że
_asdict
jest przestarzała (patrz tutaj ) i sugerowała użycie wbudowanej metody vars . Ta rada jest teraz nieaktualna; aby naprawić błąd związany z podklasami,__dict__
właściwość, która była obecna w namedtuples, została ponownie usunięta przez to zatwierdzenie .źródło
_asdict
nie powinien być aliasowany w bibliotece standardowejasdict
?"asdict"
być jednym z nazwisk krotki.Istnieje wbudowana metoda w
namedtuple
instancjach do tego_asdict
,.Jak omówiono w komentarzach, w niektórych wersjach
vars()
również to zrobi, ale najwyraźniej jest to wysoce zależne od szczegółów kompilacji, podczas gdy_asdict
powinno być niezawodne. W niektórych wersjach_asdict
został oznaczony jako przestarzałe, ale komentarze wskazują, że nie ma to już miejsca od 3.4.źródło
_asdict
metoda została przestarzała w pythonie3 (na korzyść vars)vars
nie działa na niektórych starszych wersjach - w wersji 2.7 podnosi aTypeError
, ponieważnamedtuple
klasa tej wersji nie ma__dict__
atrybutu.W wersjach python2.7 i python3.4 Ubuntu 14.04 LTS
__dict__
właściwość działała zgodnie z oczekiwaniami._asdict
Metoda również działa, ale jestem skłonny do korzystania z określonych standardach, jednolity, nieruchomości API zamiast zlokalizowanej niejednorodnego API.$ python2.7
Postrzeganie jako dykt jest semantycznym sposobem na uzyskanie słownika reprezentującego wszystko (przynajmniej według mojej najlepszej wiedzy).
Byłoby miło zgromadzić tabelę głównych wersji Pythona i platform oraz ich wsparcia
__dict__
, obecnie mam tylko jedną wersję platformy i dwie wersje Pythona, jak napisano powyżej.źródło
__dict__
nie działa.Przypadek 1: krotka jednowymiarowa
Przypadek 2:
Krotka dwuwymiarowa Przykład: DICT_ROLES [961] # pokaże „Back-End Programmer”
źródło
jeśli nie ma _asdict (), możesz użyć tego sposobu:
źródło
Python 3. Przydziel dowolne pole do słownika jako wymagany indeks słownika, użyłem 'name'.
źródło