En un momento u otro, puede encontrar funciones con muchos argumentos. A veces tiene sentido combinar algunos de los argumentos en super-argumentos. A menudo he hecho esto con dictos, pero ahora estoy buscando mejores formas de hacerlo.
Me gustaría girar ...
def do_something(ax, ay, az, bu, bv, c):
# Do something
... dentro ...
def do_something(a, b, c):
# Do something
... donde a
y b
contienen sus subvariaciones.
Una forma de hacer esto es hacer:
A = namedtuple('A', 'x, y, z')
a = A(ax, ay, az)
B = namedtuple('B', 'u, v')
b = B(bu, bv)
Sin embargo, esto parece más simple:
a = SimpleNamespace(x=ax, y=ay, z=az)
b = SimpleNamespace(u=bu, v=bv)
¿Cuál es el inconveniente? El hecho de que a
y b
no están bien escritos? ¿No son objetos A y B?
(Por cierto, no te preocupes por los nombres de las variables. Normalmente no uso como nombres cortos de variables).
python
variables
dictionary
André Christoffer Andersen
fuente
fuente
Respuestas:
SimpleNamespace
es básicamente una bonita fachada encima de un diccionario. Le permite usar propiedades en lugar de claves de índice. Esto es bueno ya que es súper flexible y fácil de manipular.La desventaja de esa flexibilidad es que no proporciona ninguna estructura. No hay nada que impida que alguien llame
SimpleNamespace(x=ax, y=ay)
(ydel a.z
en algún momento más tarde). Si esta instancia se pasa a su función, la excepción ocurre cuando intenta acceder al campo.Por el contrario, le
namedtuple
permite crear un tipo estructurado. El tipo tendrá un nombre y sabrá qué campos se supone que debe tener. No podrá crear una instancia sin cada uno de esos campos y no se pueden eliminar más adelante. Además, la instancia es inmutable, por lo que sabrá que el valor ena.x
siempre será el mismo.Depende de usted decidir si necesita la flexibilidad que
SimpleNamespace
le brinda, o si prefiere tener la estructura y las garantías proporcionadasnamedtuple
.fuente
Realmente me gusta la respuesta sobre estructurado versus no, así que solo proporciono un ejemplo concreto a continuación.
SimpleNamespace
aceptará claves que comienzan con_
. Si está buscando una forma rápida y fácil de convertir, digamos, JSON que no controla en objetos con nombres de campo, esto es muy útil:Tenga en cuenta que puede ver que
namedtuple
nos da un objeto extra completo queSimpleNamespace
nunca lo hará. Cada unoSimpleNamespace
es realmente un "copo de nieve único", mientras quenamedtuple
existe sin ser instanciado con ningún valor concreto. Donde sea que necesite abstracciones que se generalicen en valores concretos, probablemente debería preferirlo.fuente
Resumen de
SimpleNamespace
Permite inicializar atributos mientras se construye el objeto:
Proporciona una legible
Anula la comparación predeterminada. En lugar de comparar por
id()
, compara los valores de los atributos en su lugar.fuente