O que passo como o primeiro parâmetro " object
" para a função setattr(object, name, value)
, para definir variáveis no módulo atual?
Por exemplo:
setattr(object, "SOME_CONSTANT", 42);
dando o mesmo efeito que:
SOME_CONSTANT = 42
dentro do módulo que contém essas linhas (com o correto object
).
Estou gerando vários valores no nível do módulo dinamicamente e, como não posso definir __getattr__
no nível do módulo, esse é o meu fallback.
vars()
no escopo no nível do módulo, e não dentro de uma função.vars()
é equivalente aglobals()
no escopo do módulo (e, portanto, retorna um ditado verdadeiro e modificável), mas aolocals()
escopo da função (e, portanto, retorna um pseudodict de nunca ser modificado). Eu usovars()
no escopo do módulo, pois economiza 3 caracteres, uma sílaba, vs seu sinônimo-em-que-scopeglobals()
;-)exec ''
: time uma função com alguns loops substanciais em cada sentido, e você verá a importância dessa otimização central para o desempenho do Python.Se você deve definir variáveis de escopo do módulo de dentro do módulo, o que há de errado
global
?portanto:
fonte
global but not really
declaração intrigante. Suponho que possa ser uma relíquia histórica que antecede os espaços de nomes dos módulos.No Python 3.7, você poderá usar
__getattr__
no nível do módulo ( resposta relacionada ).Por PEP 562 :
fonte
globals()["SOME_CONSTANT"] = 42
fonte
SOME_CONSTANT
calculado em tempo de execução não é exatamente constante. E seglobals()
não estiver disponível para você, você deverá acessar outro módulo para modificar seus atributos; isso deve fazer as pessoas se perguntarem.