Używam już tej funkcji, aby zmienić jakiś ciąg do obiektu klasy.

Ale teraz zdefiniowałem nowy moduł. Jak mogę wdrożyć tę samą funkcjonalność?

def str2class(str):
    return getattr(sys.modules[__name__], str)

Chcę pomyśleć jakiś przykład, ale trudno jest myśleć. W każdym razie głównym problemem jest problem ścieżki pliku.

Jeśli naprawdę potrzebujesz przykładu, kodu Github jest Oto.

Plik Chain.py musi wykonać mechanizm automatycznego działania. Teraz to się nie powiedzie.

nowe podejście:
Teraz umieściłem wszystkie pliki pod jednym filifold i działa, ale jeśli korzystam z koncepcji modułów, nie powiedzie się. Więc jeśli problem jest w pliku modułu, jak mogę zmienić obiekt STRING do obiektu klasy względnej?

Dzięki za pomoc.

-1
wanze 13 sierpień 2014, 16:58

2 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić, uzyskując bezpośrednio dostęp do przestrzeni nazw modułu:

import module
f = module.__dict__["func_name"]
# f is now a function and can be called:
f()

Jedną z największych rzeczy o Pythonie jest to, że internalia są dostępne dla Ciebie i że pasują do paradygmatu języka. Nazwa (zmiennej, klasy, funkcji, cokolwiek) w przestrzeni nazw jest w rzeczywistości kluczem w słowniku, który mapuje wartość tej nazwy.

Jeśli jesteś zainteresowany tym, z którymi można grać inne języki, spróbuj uruchomić dir() na rzeczy. Byłbyś zaskoczony liczbą ukrytych metod dostępnych w większości obiektów.

0
Arusekk 14 sierpień 2014, 12:45

Prawdopodobnie powinieneś napisać tę funkcję tak, jak:

def str2class(s):
    return globals()[s]

Jest naprawdę wyraźniejszy i działa, nawet jeśli __name__ jest ustawiony na __main__.

0
Arusekk 13 sierpień 2014, 13:07