tipos - types of variables in python
¿Cómo importo paquetes variables en Python como usar variables variables($$) en PHP? (5)
Quiero importar un paquete dependiendo de qué valor elija el usuario.
El valor predeterminado es file1.py
:
from files import file1
Si el usuario elige el file2
, debería ser:
from files import file2
En PHP, puedo hacer esto usando variables variables :
$file_name = ''file1'';
include($$file_name);
$file_name = ''file2'';
include($$file_name);
¿Cómo puedo hacer esto en Python?
Como dice Fredrik Lundh:
De todos modos, así es cómo funcionan estas declaraciones y funciones:
import X
importa el módulo X y crea una referencia a ese módulo en el espacio de nombre actual. O en otras palabras, después de ejecutar esta instrucción, puede usarX.name
para referirse a las cosas definidas en el módulo X.
from X import *
importa el módulo X y crea referencias en el espacio de nombres actual para todos los objetos públicos definidos por ese módulo (es decir, todo lo que no tiene un nombre que empiece por "_"). O en otras palabras, después de ejecutar esta instrucción, simplemente puede usar un nombre simple para referirse a las cosas definidas en el módulo X. Pero X no está definido, por lo queX.name
no funciona. Y si el nombre ya estaba definido, se reemplaza por la nueva versión. Y si el nombre en X se cambia para señalar a otro objeto, su módulo no lo notará.
from X import a, b, c
importa el módulo X y crea referencias en el espacio de nombres actual para los objetos dados. O en otras palabras, ahora puede usarb
yc
en su programa.Finalmente,
X = __import__(''X'')
funciona comoimport X
, con la diferencia de que 1) pasa el nombre del módulo como una cadena, y 2) lo asigna explícitamente a una variable en su espacio de nombre actual.
Y, por cierto, ese es el último método en el que estás interesado.
Simplemente escribe (por ejemplo):
var = "datetime"
module = __import__(var)
Probablemente sea una mala idea dejar que el usuario elija qué importar. Los paquetes pueden ejecutar código en la importación, por lo que efectivamente le permite a un usuario ejecutar código de forma arbitraria en su sistema. Mucho más seguro para hacer algo como
if user_input == ''file1.py'':
from files import file1 as file
elif user_input == ''file2.py'':
from files import file2 as file
else:
file = None
print "Sorry, you can''t import that file"
Python no tiene una función que sea directamente equivalente a las "variables variables" de PHP. Para obtener el valor de una "variable variable" (o el valor de cualquier otra expresión) puede usar la función eval
.
foo = "Hello World"
print eval("foo")
Sin embargo, esto no se puede usar en una declaración de import
.
Es posible usar la función __import__
para importar usando una variable.
package = "os"
name = "path"
imported = getattr(__import__(package, fromlist=[name]), name)
es equivalente a
from os import path as imported
Viejo hilo, pero necesitaba la respuesta, por lo que alguien más podría ...
Hay una manera más clara de hacer esto en Python 2.7+:
import importlib
my_module = importlib.import_module("package.path.%s" % module_name)
mattjbray
en la respuesta de mattjbray
:
from importlib import import_module
# lookup in a set is in constant time
safe_names = {"file1.py", "file2.py", "file3.py", ...}
user_input = ...
if user_input in safe_names:
file = import_module(user_input)
else:
print("Nope, not doing this.")
Guarda algunas líneas de código, y le permite establecer safe_names
programáticamente, o cargar múltiples módulos y asignarlos a un dict, por ejemplo.