Biorąc pod uwagę dowolny obiekt Pythona, czy istnieje prosty sposób na uzyskanie listy wszystkich metod, które ten obiekt ma?
Lub,
jeśli nie jest to możliwe, czy istnieje co najmniej łatwy sposób sprawdzenia, czy ma określoną metodę inną niż zwykłe sprawdzenie, czy wystąpił błąd podczas wywoływania metody?
python
introspection
Thomas Lötzer
źródło
źródło
Odpowiedzi:
W przypadku wielu obiektów możesz użyć tego kodu, zastępując „obiekt” obiektem, który Cię interesuje:
Odkryłem to na stronie diveintopython.net (teraz zarchiwizowane). Mam nadzieję, że powinno to dostarczyć dalszych szczegółów!
Jeśli otrzymasz
AttributeError
, możesz użyć tego zamiast :getattr(
nie toleruje abstrakcyjnych wirtualnych podklas w stylu python3.6. Ten kod działa tak samo jak powyżej i ignoruje wyjątki.źródło
print [method for method in dir(object) if callable(getattr(object, method))]
.AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
kiedy próbuję to uruchomić. Zobacz szczegóły na stackoverflow.com/q/54713287/9677043 .Możesz użyć wbudowanej
dir()
funkcji, aby uzyskać listę wszystkich atrybutów modułu. Wypróbuj to w wierszu polecenia, aby zobaczyć, jak to działa.Możesz także użyć tej
hasattr(module_name, "attr_name")
funkcji, aby dowiedzieć się, czy moduł ma określony atrybut.Aby uzyskać więcej informacji, zobacz Przewodnik po introspekcji w języku Python .
źródło
hasattr
pomógł mojemu przypadkowi użycia sprawdzić, czy obiekt Pythona ma określoną zmienną składową lub metodę.Najprostszą metodą jest użycie
dir(objectname)
. Wyświetli wszystkie metody dostępne dla tego obiektu. Fajna sztuczka.źródło
AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'
. Jakieś pomysły? Zobacz deets na stackoverflow.com/q/54713287/9677043 . +1 do @Pawan Kumar b / c odpowiedź działa, a dla @ljs za obietnicę przefiltrowanej listy tylko metod.Aby sprawdzić, czy ma określoną metodę:
źródło
if hasattr(obj,method) and callable(getattr(obj,method)):
Wierzę, że to, czego chcesz, to coś takiego:
Moim skromnym zdaniem wbudowana funkcja
dir()
może wykonać tę pracę za Ciebie. Pobrane zhelp(dir)
danych wyjściowych powłoki Python Shell:Na przykład:
Sprawdzając twój problem, postanowiłem zademonstrować swój tok myślenia, z lepszym formatowaniem danych wyjściowych
dir()
.dir_attributes.py (Python 2.7.6)
dir_attributes.py (Python 3.4.3)
Mam nadzieję, że przyczyniłem się :).
źródło
Oprócz bardziej bezpośrednich odpowiedzi, byłbym niedoceniony, gdybym nie wspomniał o iPython . Naciśnij „tab”, aby zobaczyć dostępne metody z autouzupełnianiem.
A gdy znajdziesz metodę, spróbuj:
aby zobaczyć pydoki, podpis metody itp.
Ahh ... REPL .
źródło
Jeśli potrzebujesz metod , powinieneś użyć inspect.ismethod .
W przypadku nazw metod:
Dla samych metod:
Czasami
inspect.isroutine
może być również przydatny (dla wbudowanych rozszerzeń C, Cython bez „wiążącej” dyrektywy kompilatora).źródło
inspect.getmembers
zamiastdir
rozumieć listę?Otwórz powłokę bash (ctrl + alt + T na Ubuntu). Uruchom w nim powłokę python3. Utwórz obiekt do obserwacji metod. Po prostu dodaj kropkę i naciśnij dwukrotnie „tab”, a zobaczysz coś takiego:
źródło
ipython
, zacząć pisać obiekt i nacisnąć,tab
a on również zadziała. Nie są wymagane ustawienia readlineProblem ze wszystkimi wskazanymi tutaj metodami polega na tym, że NIE MOŻESZ być pewien, że metoda nie istnieje.
W Pythonie można przechwytywać kropki wywołujące
__getattr__
i__getattribute__
, dzięki czemu możliwe jest utworzenie metody „w czasie wykonywania”Przykład:
Jeśli go wykonasz, możesz wywołać metodę nieistniejącą w słowniku obiektowym ...
I dlatego używasz Łatwiejszego do wybaczenia niż paradygmatów zgody w Pythonie.
źródło
Najprostszym sposobem uzyskania listy metod dowolnego obiektu jest użycie
help()
polecenia.Spowoduje to wyświetlenie wszystkich dostępnych / ważnych metod związanych z tym obiektem.
Na przykład:
źródło
%
pierwszy przykład? To nie działa w moim Pythonie 2.7.To powinno działać :)
źródło
Można utworzyć
getAttrs
funkcję, która zwróci nazwy właściwości obiektu, które można wywoływaćTo by wróciło
źródło
Nie ma niezawodnego sposobu wylistowania wszystkich metod obiektu.
dir(object)
jest zwykle przydatny, ale w niektórych przypadkach może nie zawierać wszystkich metod. Zgodnie zdir()
dokumentacją : „Za pomocą argumentu spróbuj zwrócić listę prawidłowych atrybutów dla tego obiektu”.Sprawdzanie, czy istnieje metoda, można wykonać,
callable(getattr(object, method))
jak już tam wspomniano.źródło
Weź listę jako obiekt
list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))
Dostajesz:
źródło
Chociaż „ Łatwiej prosić o wybaczenie niż o pozwolenie ” jest z pewnością pytonicznym sposobem, czego szukasz może:
źródło
Aby wyszukać określoną metodę w całym module
źródło
Jeśli na przykład używasz powłoki plus, możesz użyć tego:
w ten sposób z „??” zaraz po twoim obiekcie pokażą ci wszystkie atrybuty / metody klasy.
źródło