In passato ho utilizzato la funzione AUTOLOAD di perl per implementare il caricamento pigro dei simboli in uno spazio dei nomi e volevo la stessa funzionalità in python.Autoload in Python
Tradizionalmente il più vicino che si riesce a ottenere è quello di utilizzare una classe e una classe __getattr__
per ottenere questo tipo di cose. Tuttavia Ho anche provato a rovistare sys.modules
, e venire con questo:
# mymod.py
def greet(greeting="Hello World"):
print greeting
class autoload(object):
def __init__(self, __name__):
super(autoload, self).__init__()
self.wrapped_name = __name__
self.wrapped = sys.modules[__name__]
def __getattr__(self, name):
try:
return getattr(self.wrapped, name)
except AttributeError:
def f():
greet(name+" "+self.wrapped_name)
return f
if __name__ != "__main__":
import sys
sys.modules[__name__] = autoload(__name__)
Questo funziona il modo in cui mi piacerebbe da un punto di vista dell'utente:
~> python
Python 2.5.1 (r251:54863, Jan 10 2008, 18:01:57)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymod
>>> mymod.hello()
hello
>>> from mymod import Hello_World
>>> Hello_World()
Hello_World
Ma mi colpisce - c'è un approccio standard che le persone tendono ad usare per l'autoloading in Python?
In secondo luogo, una domanda per esperti sviluppatori Python è davvero "questo ti colpisce come buona o cattiva pratica"? Sono uno sviluppatore python abbastanza esperto e mi sembra davvero utile, ma mi sembra marginale e interessato a vedere se questo può essere visto come una buona pratica, una cattiva pratica o qualcosa di simile.
Grazie!
https://stackoverflow.com/questions/2447353/getattr-on-a-module e https://stackoverflow.com/questions/922550/how-to-mark-a-global-as-deprecated-in -python/922693 # 922693 – n611x007
Vorrei eliminarlo se possibile, perché le modifiche al testo della domanda e il codice e i tag non riflettono più la mia domanda originale. Le risposte qui sotto non sono particolarmente utili neanche.Mi auguro che la gente in realtà chieda prima di cambiare il testo di una domanda di qualcuno. Ad esempio, il motivo per cui il codice originale utilizzato "\ _ \ _ nome \ _ \ _" piuttosto che "nome_mod" è mostrare la diretta somiglianza a sys.modules [\ _ \ _ nome \ _ \ _] e così via. Questo è stato rotto da modifiche. –
@MichaelSparks: ho inoltrato la domanda alla modifica secondaria di SilentGhost. Speriamo che abbini le risposte meglio ora. E nessuno dovrebbe modificare il codice nella domanda di qualcun altro. –