style snake_case sheet pep257 name guide guia cheat python coding-style autoload

snake_case - Autoload en Python



python style guide (3)

Las "importaciones perezosas" podrían construirse encima de los "ganchos de importación" especificados en PEP 302 , y ahora totalmente implementados. PEP 369 solía cubrir "importaciones perezosas" así como ganchos posteriores a la importación, pero desde entonces se ha simplificado y ahora solo cubre ganchos posteriores a la importación; aún así, podría estar interesado en el borrador original .

En esta receta se puede encontrar una buena implementación de "importaciones perezosas" a través del enganche meta_path .

En el pasado, he utilizado la función AUTOLOAD de perl para implementar la carga perezosa de símbolos en un espacio de nombres, y quería la misma funcionalidad en python.

Tradicionalmente, lo más cercano a lo que parece poder llegar es usar una clase y una clase __getattr__ para lograr este tipo de cosas. Sin embargo, también he intentado hurgar en sys.modules , y llegar a esto:

# 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__)

Esto funciona como me gustaría desde la perspectiva del usuario:

~> 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

Pero me sorprende, ¿existe un enfoque estándar que las personas tienden a utilizar para la carga automática en python?

En segundo lugar, una pregunta para los desarrolladores de Python con experiencia realmente es "¿te parece que esto es una buena o una mala práctica?" Soy un desarrollador de Python con una experiencia razonable, y me parece muy útil, pero me parece que está en el límite y está interesado en saber si esto se puede ver como una buena práctica, una mala práctica o algo similar.

¡Gracias!


No, no creo que sea útil.

¿Por qué crear una función sobre la marcha para cada atributo que intenta obtener del módulo? Me parece confuso. Parece que las nuevas funciones están siendo creadas por magia, por lo que uno tiene que mirar profundamente en la implementación para entender lo que está sucediendo. Y todo eso sin beneficios sintácticos.

E incluso si tuviera una buena razón para hacerlo, ¿por qué hacerlo con un módulo? ¿Por qué registrar su instancia de clase en sys.modules ? Creo que hacer que las cosas parezcan lo que no son está mal visto en Python.

A menos que usted esté confundiendo el código a propósito, no veo por qué uno haría todo eso.


Para responder a la pregunta de usar una clase para hacerse pasar por un módulo:

Sí, la funcionalidad no es accidental. Ha estado allí desde el principio de la serie 2.x y aún funciona en la serie 3.x.

Para responder a la pregunta de la carga perezosa:

Hay varias formas de hacerlo, y cada una será un poco misteriosa. Usar un imitador de módulo es un buen método.