Buduję bardzo podstawową platformę w postaci modułu Python 2.7. Moduł ten ma pętlę odczytu-eval-print, w której wprowadzone polecenia użytkownika są odwzorowywane na wywołania funkcji. Ponieważ staram się ułatwić budowanie modułów wtyczek dla mojej platformy, wywołania funkcji będą pochodzić z mojego głównego modułu do dowolnego modułu wtyczki. Chciałbym, żeby konstruktor wtyczek mógł określić polecenie, które chce wywołać jego funkcję, więc szukałem sposobu Pythonicznego, aby zdalnie wprowadzić mapowanie w poleceniu-> funkcja dict w module głównym z moduł wtyczki.Najbardziej Pythonowy sposób dostarczania metadanych funkcji w czasie kompilacji?
szukałem w kilku rzeczy: imię
metody analizowania: moduł główny będzie importować moduł wtyczki i zeskanować go do nazwy metody pasujących do pewnego formatu. Dla przykładu może dodać metodę download_file_command (file) do jej dyktafonu jako "download file" -> download_file_command. Jednak uzyskanie zwięzłej, łatwej do napisania nazwy polecenia (np. "Dl") wymaga, aby nazwa funkcji była krótka, co nie jest dobre dla czytelności kodu . Wymaga to także, aby programista wtyczki dostosował się do precyzyjnego formatu nazw na podstawie .
Cross-moduł dekoratorzy: dekoratorzy pozwoliłby dewelopera wtyczki nazwać swoją funkcję, co chce i po prostu dodać coś takiego @ Main.register („dl”), ale oni muszą wymagać, że zarówno zmodyfikować przestrzeń nazw innego modułu i zachować globalny stan w module głównym. Rozumiem, że to bardzo źle.
samo-moduł dekoratorzy: wykorzystujące tę samą logikę jak wyżej, mogę dodać dekorator, który dodaje nazwą funkcji do jakiegoś polecenia nazwa-> mapowanie funkcji lokalnego modułu wtyczki i odzyskać mapowanie do Główny moduł z wywołaniem API . Wymaga to, aby pewne metody zawsze były obecne lub zostały odziedziczone, i - jeśli moje rozumienie dekoratorów jest poprawne - funkcja zarejestruje się tylko przy pierwszym uruchomieniu i będzie niepotrzebnie rejestrować się ponownie po każdym następnym czasie.
Tak więc, co naprawdę potrzebne jest pythonowy sposobem opisywania funkcję o nazwie polecenia, które powinny skutkować iw ten sposób nie może być nazwą funkcji. Muszę być w stanie wyodrębnić nazwę polecenia-> odwzorowanie funkcji, gdy importuję moduł, a mniej pracy po stronie dewelopera wtyczki jest dużym plusem.
Dziękuję za pomoc i przepraszam, jeśli w moim zrozumieniu Pythona są jakieś błędy; Jestem stosunkowo nowy w tym języku.
Tylko sprawdzam sobie sprawę, ale dekoratorzy (definicje i funkcyjne) wykonać w czasie wykonywania, jedyną rzeczą, Python robi w czasie kompilacji jest kompilacji kodu. – Duncan
Nic złego w metodzie 2. Niech zrobią coś takiego jak "importuj wtyczkę" i wykonaj '@ plugin.register ('moja_nazwa_metody') \ ndef somefunc_meeting_an_api_spec(): ...' –
Możesz chcieć rzucić okiem na to jak [plac] (http://pypi.python.org/pypi/plac) to robi. – georg