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 ay bcontienen 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 ay bno 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:
SimpleNamespacees 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.zen 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
namedtuplepermite 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.xsiempre será el mismo.Depende de usted decidir si necesita la flexibilidad que
SimpleNamespacele 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.
SimpleNamespaceaceptará 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
namedtuplenos da un objeto extra completo queSimpleNamespacenunca lo hará. Cada unoSimpleNamespacees realmente un "copo de nieve único", mientras quenamedtupleexiste 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
SimpleNamespacePermite 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