Jaki jest najlepszy sposób na wywołanie funkcji o podanym ciągu znaków z nazwą funkcji w programie Python. Na przykład, powiedzmy, że mam moduł foo
i mam ciąg znaków, którego treść jest "bar"
. Jak najlepiej zadzwonić foo.bar()
?
Potrzebuję uzyskać wartość zwracaną przez funkcję, dlatego po prostu jej nie używam eval
. Zrozumiałem, jak to zrobić, używając eval
funkcji temp, która zwraca wynik tego wywołania funkcji, ale mam nadzieję, że istnieje bardziej elegancki sposób na zrobienie tego.
foo
module można użyćglobals()
, aby to zrobić:methodToCall = globals()['bar']
lub
locals zwraca słownik z bieżącą lokalną tablicą symboli. globals zwraca słownik z globalną tablicą symboli.
źródło
Rozwiązanie Patricka jest prawdopodobnie najczystsze. Jeśli chcesz również dynamicznie podnieść moduł, możesz go zaimportować w następujący sposób:
źródło
importlib.import_module
. Oficjalne dokumenty mówią o__import__
: „Jest to zaawansowana funkcja, która nie jest potrzebna w codziennym programowaniu w języku Python, w przeciwieństwie do importlib.import_module ().” docs.python.org/2/library/functions.html#__import__importlib.import_module
jest obsługiwany w wersji 3.6. Zobacz docs.python.org/3.6/library/…Tylko prosty wkład. Jeśli klasa, którą musimy wprowadzić, znajduje się w tym samym pliku, możemy użyć czegoś takiego:
Na przykład:
A jeśli nie klasa:
źródło
Biorąc pod uwagę ciąg znaków wraz z pełną ścieżką do funkcji w języku Python, w ten sposób zacząłem uzyskiwać wynik tej funkcji:
źródło
__import__
funkcji.Najlepsza odpowiedź zgodnie z najczęściej zadawanymi pytaniami dotyczącymi programowania w języku Python :
źródło
Odpowiedź (mam nadzieję) nikt nigdy nie chciał
Zachowanie przypominające ewolucję
Dlaczego nie dodać automatycznego importowania
Jeśli mamy dodatkowe słowniki, które chcemy sprawdzić
Musimy zejść głębiej
źródło
Jeśli chodzi o wartość, jeśli chcesz przekazać nazwę funkcji (lub klasy) i nazwę aplikacji jako ciąg, możesz to zrobić:
źródło
handler = getattr(sys.modules[__name__], myFnName)
Spróbuj tego. Chociaż nadal używa eval, używa go tylko do przywołania funkcji z bieżącego kontekstu . Następnie masz prawdziwą funkcję do użycia, jak chcesz.
Główną korzyścią z tego jest to, że w momencie przywołania funkcji otrzymasz błędy związane z ewaluacją. Wtedy podczas połączenia otrzymasz tylko błędy związane z funkcją.
źródło
eval
chyba że jest to absolutnie konieczne.getattr(__module__, method_name)
jest znacznie lepszym wyborem w tym kontekście.nic z tego, co sugerowano, nie pomogło mi. Odkryłem to jednak.
Używam Pythona 2.66
Mam nadzieję że to pomoże
źródło
self.__getattribute__('title')
jest równyself.title
self.__getattribute__('title')
w końcu nie działa (nie wiem dlaczego), alefunc = getattr(self, 'title'); func();
działa. Więc może lepiej jest użyćgetattr()
zamiast tegogetattr
zamiast tego.Jako pytanie: Jak dynamicznie wywoływać metody w klasie za pomocą przypisania nazwy metody do zmiennej [duplikat] oznaczonej jako duplikat tak jak tutaj, zamieszczam pokrewną odpowiedź tutaj:
Scenariusz jest taki, że metoda w klasie chce dynamicznie wywoływać inną metodę w tej samej klasie. Dodałem kilka szczegółów do oryginalnego przykładu, który oferuje szerszy scenariusz i przejrzystość:
źródło
To prosta odpowiedź, która pozwoli na przykład wyczyścić ekran. Poniżej znajdują się dwa przykłady, z eval i exec, które wypisują 0 na górze po czyszczeniu (jeśli używasz Windowsa, zmień
clear
nacls
, użytkownicy Linuksa i Maca wychodzą tak jak na przykład) lub po prostu uruchom je odpowiednio.źródło