dir(re.compile(pattern))
nie zwraca wzoru jako jednego z elementów list. Mianowicie zwraca:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
Zgodnie z instrukcją powinien on zawierać
nazwy atrybutów obiektu, nazwy atrybutów jego klasy i rekurencyjnie atrybuty klas podstawowych klasy.
Mówi również, że
Lista niekoniecznie jest kompletna.
Czy istnieje sposób na uzyskanie pełnej listy? Zawsze zakładałem, że reż zwraca pełną listę, ale najwyraźniej nie ...
Ponadto: czy istnieje sposób, aby wyświetlić tylko atrybuty? Czy tylko metody?
Edycja: w rzeczywistości jest to błąd w pythonie -> podobno został naprawiony w gałęzi 3.0 (a być może także w wersji 2.6)
dir()
z modułu inspekcji jest na ogół właściwym sposobem. Czy użyłeśre
modułu jako przykładu, czy chcesz osiągnąć specjalny cel?__dir__()
Odpowiedzi:
Dla kompletnej listy atrybutów, krótka odpowiedź brzmi: nie. Problem polega na tym, że atrybuty są faktycznie zdefiniowane jako argumenty akceptowane przez
getattr
wbudowaną funkcję. Ponieważ użytkownik może ponownie wdrożyć__getattr__
, nagle dopuszczając dowolny rodzaj atrybutu, nie ma żadnego możliwego ogólnego sposobu wygenerowania tej listy.dir
Zwraca klucze w__dict__
atrybutu, czyli wszystkie atrybuty dostępne, jeśli__getattr__
metoda nie jest przepisany.W przypadku drugiego pytania to naprawdę nie ma sensu. W rzeczywistości metody są atrybutami, które można wywołać, niczym więcej. Można było jednak filtrować wywoływalne atrybuty i, korzystając z
inspect
modułu, określić metody klasowe, metody lub funkcje.źródło
Dlatego nowa
__dir__()
metoda została dodana w Pythonie 2.6widzieć:
źródło
__dir
__ () jest metodą na obiekcie, a nie funkcją - proszę przeczytaj linki w odpowiedzi i topprint({k:getattr(ojb,k) for k in obj.__dir__()})
Oto praktyczny dodatek do odpowiedzi PierreBdR i Moe:
dir()
.W przypadku klas w starym stylu możemy przynajmniej zrobić to, co robi standardowy moduł w celu obsługi uzupełniania tabulatorów: oprócz tego
dir()
poszukaj__class__
, a następnie przejdź do jego__bases__
:(Kod testowy i dane wyjściowe są usuwane ze względu na zwięzłość, ale w zasadzie dla obiektów w nowym stylu wydaje się, że mamy takie same wyniki
get_object_attrs()
jak w przypadkudir()
, a dla klas w starym stylu głównym dodatkiem do danychdir()
wyjściowych wydaje się być__class__
atrybut).źródło
Tylko w celu uzupełnienia:
dir()
jest najbardziej wydajne / podstawowe narzędzie. ( Najbardziej zalecane )Rozwiązania inne niż
dir()
tylko zapewniają sposób radzenia sobie z wynikamidir()
.Wymieniając atrybuty drugiego poziomu, czy nie, ważne jest, aby przesiać samodzielnie, ponieważ czasami możesz chcieć odfiltrować wewnętrzne zmienne z wiodącymi podkreśleniami
__
, ale czasami możesz potrzebować__doc__
łańcucha dokumentów.__dir__()
idir()
zwraca identyczną treść.__dict__
idir()
są różne.__dict__
zwraca niekompletną treść.WAŻNE :
__dir__()
może być czasem zastąpione przez funkcję, wartość lub typ przez autora dla dowolnego celu.Oto przykład:
Błąd typu: deskryptor
__dir__
od'object'
obiektu wymaga argumentuAutor PyTorch zmodyfikował
__dir__()
metodę na coś, co wymaga argumentu. Ta modyfikacja powodujedir()
błąd.Jeśli chcesz, aby niezawodny schemat przechodził przez wszystkie atrybuty obiektu, pamiętaj, że każdy standard Pythona może zostać zastąpiony i może się nie utrzymywać , a każda konwencja może być zawodna.
źródło
Tak to robię, przydatne dla prostych obiektów niestandardowych, do których ciągle dodajesz atrybuty:
Biorąc pod uwagę obiekt utworzony za pomocą
obj = type("Obj",(object,),{})
lub po prostu:Dodaj niektóre atrybuty:
następnie, aby uzyskać słownik z tylko niestandardowymi atrybutami:
źródło