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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top