题
我一直在想这个时间太长了,并没有得到任何想法,或许你们中的一些可以提供帮助。
我有一个文件夹的蟒蛇脚本,所有这些都有同样的周边体(字面上,我产生它从脚本),但有一块这是不同于他们所有人。换句话说:
Top piece of code (always the same)
Middle piece of code (changes from file to file)
Bottom piece of code (always the same)
我意识到今天,这是一个糟糕的想法,例如,如果我想要改变的东西从顶部或底部,我需要写入一个脚本来这样做。(不,这很难,它似乎只是这是非常糟糕代码明智的).
所以我想做的,就是有一个外python脚本是这样的:
Top piece of code
Dynamic function that calls the middle piece of code (based on a parameter)
Bottom piece of code
然后每一个其他python文件在文件夹中可以简单地将中间的一段代码。然而,正常的模块就不会在这里工作(除非我错了),因为我会得到代码我需要执行从争论,这将是一个串的,因而我不知道哪些功能以运行,直到运行时间。
所以我想了两个方案:
- 我可以写一堆如果发言,一个到运行的各个脚本根据某些参数。我拒绝了这一点,因为它甚至更糟糕的是比先前的设计。
我可以使用:
操作系统。命令(sys.argv[0]scriptName.py)
这将运行该脚本,但是叫蟒蛇叫蟒蛇似乎并不非常优雅的给我。
所以没有任何人有任何其他想法吗?谢谢你。
解决方案
如果你知道名字的功能为串名模块,作为一串,然后你可以做的
mod = __import__(module_name)
fn = getattr(mod, fn_name)
fn()
其他提示
另一个可能的解决办法是要有你的每一个重复的文件进功能从的主要文件
from topAndBottom import top, bottom
top()
# do middle stuff
bottom()
除了几个答案已经公布,考虑 模板的方法 设计图案:让一个抽象的类如
class Base(object):
def top(self): ...
def bottom(self): ...
def middle(self): raise NotImplementedError
def doit(self):
self.top()
self.middle()
self.bottom()
每可插入模块然后一类继承这个 Base
必须复盖 middle
与相关代码。
也许不值得为这个简单的情况(你仍然要进口的权利的模块以便实例类和呼叫 doit
就),但是仍然值得铭记(连同它的许多Python变化,这是我具有充分解释,在许多技术会谈,现在可以上youtube)的案件数目或复杂的"可插入件"保持增长--模板的方法(尽管它的可怕的名称;-)是一种固体,行之有效和高度可伸缩的模式[[有时候有点太僵硬, 但是,这正是我的地址,在这些许多科技谈判--并且这一问题不适用于此具体使用情况]].
然而,正常的模块就不会在这里工作(除非我错了),因为我会得到代码我需要执行从争论,这将是一个串的,因而我不知道哪些功能以运行,直到运行时间。
它将工作很好用的 __import__
内或者,如果具有非常复杂的布局, imp 模块输入你的脚本。然后你可以得到的功能,通过 module.__dict__[funcname]
例如。
进口一个模块(如在其他的答案)是肯定的清洁的方式来做到这一点,但是,如果由于某种原因不工作,只要你没有做任何事情太奇怪了,你可以使用 exec
.它基本上运行的内容的其他文件,如果它们包括在前文件在哪里 exec
被称为。这是最近的事Python有一个 source
声明的种类包括在许多炮弹。作为最低限度,这样应工作:
exec(open(filename).read(None))
这个怎么样?
function do_thing_one():
pass
function do_thing_two():
pass
dispatch = { "one" : do_thing_one,
"two" : do_thing_two,
}
# do something to get your string from the command line (optparse, argv, whatever)
# and put it in variable "mystring"
# do top thing
f = dispatch[mystring]
f()
# do bottom thing