avaliação preguiçosa em Python? Entre os módulos?
-
19-09-2019 - |
Pergunta
Eu não tenho certeza se algo como isso é mesmo possível em Python, mas se é que seria realmente útil (pelo menos para mim, neste caso).
Eu tenho um quadro de teste em que eu quero manter a configuração de teste separada dos comandos de teste. Isso é útil porque ele permite que você misturar e combinar configurações / testes sem realmente ter que modificar qualquer código. I, essencialmente, apenas um tem um script corredor curto que leva o nome de um módulo de configuração e um módulo de teste, em seguida, carrega e roda tanto, assim:
config = __import__(configmod)
test = __import__(commandsmod)
config.run(test.commands)
O único problema com isto é que eu realmente como o script de teste para ter alguma consciência limitada dos parâmetros de configuração. Idealmente, eu gostaria de ser capaz de fazer algo como o seguinte no teste / comandos módulo:
command1 = MyCommand(arg1, arg2, LazyArg1())
command2 = MyCommand(arg1, arg2, LazyArg2())
commands = [command1, command2]
onde LazyArg1 e LazyArg2 são métodos que são definidas no módulo de configuração (ou o módulo de corredor que importações tanto de configuração / comandos). Existe alguma maneira para atrasar a avaliação destas funções até que sejam realmente definido?
Eu também estaria aberto a outras formas de atingir o mesmo fim. A única outra idéia que eu tinha era de ter o módulo de configuração de gravação de um dicionário para arquivo e, em seguida, ter a importação módulo de comandos que (supondo que você acabou de escrever repr(mydict)
). Esta não é muito atraente .. embora ele iria trabalhar.
Solução
Python é digitado de forma dinâmica, de modo que este é nada extravagante:
configMod.py:
##### this is configMod.py ##### modTestArg1 = "Brian" def runTest(testMod, *args, **kwargs): testMod.doTest(*args, **kwargs)
testMod.py:
##### this is testMod.py ##### def doTest(name, address, city="San Francisco"): print "doTest called with name: %s, address: %s, city: %s" % \ (name, address, city)
controlMod.py
##### this is controlMod.py ##### import configMod import testMod configMod.runTest(testMod, configMod.modTestArg1, "123 Fake Street")
Run-lo:
python controlMod.py doTest called with name: Brian, address: 123 Fake Street, city: San Francisco
Outras dicas
Eu odeio a responder à minha própria pergunta, mas depois de mais algum pensamento, eu vim com uma solução potencial (embora eu adoraria ouvir outras idéias).
Suponha que temos um mod1 módulo:
def myfunc(z):
return z
e uma mod2 módulo:
x = lambda mod: mod.myfunc
Agora você pode fazer o seguinte em um terceiro módulo:
import mod1
from mod2 import *
x(mod1)(5)
e você acaba chamando mod1
de myfunc
. Se a chamada de função dupla é confuso procurando, você pode atribuir x(mod1)
para outro nome de variável.