Sto costruendo una piattaforma molto semplice sotto forma di un modulo Python 2.7. Questo modulo ha un ciclo read-eval-print dove i comandi utente inseriti sono mappati alle chiamate di funzione. Poiché sto cercando di semplificare la compilazione dei moduli di plugin per la mia piattaforma, le chiamate alle funzioni saranno dal mio modulo principale a un modulo di plugin arbitrario. Mi piacerebbe che un plugin builder fosse in grado di specificare il comando che desidera attivare la sua funzione, quindi ho cercato un modo Pythonic per inserire in remoto una mappatura nella funzione command-> dict nel modulo Main dal modulo pluginLa maggior parte dei metodi Pythonic per fornire i metadati della funzione in fase di compilazione?
Ho guardato diverse cose:
Nome metodo di analisi: il modulo principale sarebbe importare il modulo plug- ed eseguire la scansione per i nomi dei metodi che corrispondono a un determinato formato. Per esempio , potrebbe aggiungere il metodo download_file_command (file) al suo dict come "download file" -> download_file_command. Tuttavia, ottenere un numero di comando conciso, facile da digitare (ad esempio "dl") richiede che il nome della funzione sia anche breve, il che non va bene per la leggibilità del codice . Richiede inoltre che lo sviluppatore del plugin sia conforme a un formato di denominazione preciso .
decoratori Cross-modulo: decoratori avrebbero lasciato lo sviluppatore del plugin nominare il suo funzione di quello che vuole e semplicemente aggiungere qualcosa di simile @ Main.register ("dl"), ma avrebbero necessariamente richiedere che io sia modificare lo spazio dei nomi di un altro modulo e mantenere lo stato globale nel modulo principale. Capisco che sia molto brutto.
decoratori con lo stesso modulo: utilizzando la stessa logica di cui sopra, ho potuto aggiungere un decoratore che aggiunge il nome della funzione di qualche comando nome-> funzione di mappatura locale al modulo plug- e recuperare la mappatura al Modulo principale con una chiamata API . Ciò richiede che alcuni metodi siano sempre presenti o ereditati da e, se la mia comprensione dei decoratori è corretta, la funzione si registrerà solo la prima volta che verrà eseguita e si registrerà inutilmente ogni volta successiva, .
Così, quello che ho veramente bisogno è un modo Pythonic per annotare una funzione con il nome del comando che deve innescare, e in questo modo non può essere il nome della funzione. Devo essere in grado di estrarre il nome del comando-> mappatura delle funzioni quando imparo il modulo, e qualsiasi lavoro in meno sul lato dello sviluppatore del plugin è un grande vantaggio.
Grazie per l'aiuto, e le mie scuse se ci sono dei difetti nella mia comprensione di Python; Sono relativamente nuovo alla lingua.
Proprio controllando compreso questo, ma decoratori (e funzione definizioni) eseguite in fase di esecuzione, l'unica cosa che Python fa al momento della compilazione è compilare il codice. – Duncan
Non c'è niente di sbagliato con il metodo 2. Fagli fare qualcosa come 'import plugin' e fai' @ plugin.register ('my_method_name') \ ndef somefunc_meeting_an_api_spec(): ... ' –
Potresti voler dare un'occhiata a come [plac] (http://pypi.python.org/pypi/plac) lo fa. – georg