Question

Je ne sais pas si quelque chose comme cela est encore possible en Python, mais si elle est ce serait vraiment utile (au moins pour moi dans ce cas).

J'ai un cadre de test dans lequel je veux garder la configuration de test séparé des commandes de test. Ceci est utile, car il vous permet de mélanger et de configurations / tests correspondent sans avoir à modifier le code. Je essentiellement juste ai un script court coureur qui prend le nom d'un module de configuration et un module de test, puis charge et exécute à la fois, comme suit:

config = __import__(configmod)
test = __import__(commandsmod)

config.run(test.commands)

Le seul problème avec ceci est je fait que le script de test pour avoir une certaine connaissance limitée des paramètres de configuration. Idéalement, je voudrais pouvoir faire quelque chose comme ce qui suit dans le test / commandes Module:

command1 = MyCommand(arg1, arg2, LazyArg1())
command2 = MyCommand(arg1, arg2, LazyArg2())
commands = [command1, command2]

où LazyArg1 et LazyArg2 sont des procédés qui sont définis dans le module de configuration (ou le module de canal de coulée qui importe deux config / commandes). Est-il possible de retarder l'évaluation de ces fonctions jusqu'à ce qu'ils soient réellement définis?

Je serais également ouvert à d'autres façons d'atteindre le même but. La seule autre idée que je devais était d'avoir le module de configuration écrire un dictionnaire pour déposer et ensuite le module des commandes d'importation que (en supposant que vous écrivez simplement à repr(mydict)). Ce n'est pas très attrayant .. mais il travaillerait.

Était-ce utile?

La solution

Python est typé dynamiquement, donc ce n'a rien d'extraordinaire:

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")

Lancez:

python controlMod.py
doTest called with name: Brian, address: 123 Fake Street, city: San Francisco

Autres conseils

Je déteste répondre à ma propre question, mais après un peu plus pensée, je suis venu avec une solution potentielle (bien que j'aimerais entendre d'autres idées).

Supposons que nous ayons un module MOD1:

def myfunc(z):
    return z

et un module MOD2:

x = lambda mod: mod.myfunc

Vous pouvez maintenant effectuer les opérations suivantes dans un troisième module:

import mod1
from mod2 import *

x(mod1)(5)

et vous finissez par appeler la mod1 de myfunc. Si l'appel double fonction est source de confusion à la recherche, vous pouvez attribuer x(mod1) à un autre nom de la variable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top