Em um ponto ou outro, você pode encontrar funções com muitos argumentos. Às vezes, faz sentido combinar alguns argumentos em super argumentos. Eu sempre fiz isso com ditados, mas agora estou procurando maneiras melhores de fazê-lo.
Eu gostaria de virar ...
def do_something(ax, ay, az, bu, bv, c):
# Do something
... para dentro ...
def do_something(a, b, c):
# Do something
... onde a
e b
conter suas subvariações.
Uma maneira de fazer isso é:
A = namedtuple('A', 'x, y, z')
a = A(ax, ay, az)
B = namedtuple('B', 'u, v')
b = B(bu, bv)
No entanto, isso parece mais simples:
a = SimpleNamespace(x=ax, y=ay, z=az)
b = SimpleNamespace(u=bu, v=bv)
Qual é a desvantagem? O fato de que a
e b
não são bem digitados? Eles não são objetos A e B?
(Aliás, não se preocupe com os nomes das variáveis. Normalmente não uso como nomes curtos de variáveis.)
python
variables
dictionary
André Christoffer Andersen
fonte
fonte
Respostas:
SimpleNamespace
é basicamente apenas uma bela fachada em cima de um dicionário. Ele permite que você use propriedades em vez de chaves de índice. Isso é legal, pois é super flexível e fácil de manipular.A desvantagem dessa flexibilidade é que ela não fornece nenhuma estrutura. Não há nada para impedir alguém de ligar
SimpleNamespace(x=ax, y=ay)
(edel a.z
em algum momento depois). Se essa instância for passada para sua função, a exceção ocorrerá quando você tentar acessar o campo.Por outro lado,
namedtuple
permite criar um tipo estruturado. O tipo terá um nome e saberá quais campos ele deve ter. Você não poderá criar uma instância sem cada um desses campos e eles não poderão ser removidos posteriormente. Além disso, a instância é imutável, portanto você saberá que o valor ema.x
sempre será o mesmo.Cabe a você decidir se precisa da flexibilidade que
SimpleNamespace
lhe oferece, ou se prefere ter a estrutura e as garantias fornecidas pornamedtuple
.fonte
Eu realmente gosto da resposta sobre estruturado versus não, por isso estou apenas fornecendo um exemplo concreto abaixo.
SimpleNamespace
aceitará chaves que começam com_
. Se você está procurando uma maneira rápida e fácil de transformar, digamos, JSON que você não controla em objetos com nomes de campos, isso é muito útil:Observe acima que você pode ver que
namedtuple
nos dá um objeto extra inteiro queSimpleNamespace
nunca será. Cada umSimpleNamespace
é realmente um "floco de neve único", enquantonamedtuple
existe sem nunca ser instanciado com valores concretos. Onde quer que você precise de abstrações que generalizem valores concretos, você provavelmente deve preferir.fonte
Sumário de
SimpleNamespace
Permite inicializar atributos enquanto constrói o objeto:
Ele fornece uma legível
Ele substitui a comparação padrão. Em vez de comparar
id()
, ele compara valores de atributo.fonte