在python

时间:2016-08-03 17:29:51

标签: python function definition function-declaration helper-functions

我有一个定义函数verboseprint的程序,可以根据布尔值打印或不打印到屏幕上:

# define verboseprint based on whether we're running in verbose mode or not
if in_verbose_mode:
    def verboseprint (*args):
        for arg in args:
            print arg,
        print
    print "Done defining verbose print."
else:
    # if we're not in verbosemode, do nothing
    verboseprint = lambda *a: None 

我的程序使用多个文件,我想在所有文件中使用verboseprint的这个定义。所有文件都将传递in_verbose_mode布尔值。我知道我可以在文件中自己定义verboseprint然后将其导入我的所有其他文件中,但是我需要能够基于布尔值以两种不同的方式声明函数定义。

总结一下:我需要一个可以用两种不同的方式声明另一个函数的函数,然后我可以导入到多个文件中。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

通常你不想以这种方式定义一个函数。

我认为实现这一目标的简单方法是将布尔值作为函数参数传递,并根据参数定义行为:

def verboseprint (*args, mode):
    if mode == in_verbose_mode:
        for arg in args:
            print arg,
        print
        print "Done defining verbose print."
    # if we're not in verbosemode, do nothing
    ##else:
    ##    verboseprint = lambda *a: None 

然后导入此函数以在其他文件中使用。

答案 1 :(得分:3)

您应该查看工厂设计模式。它的基本设计就是完全按照你所说的去做,尽管它可以用于类而不是函数。话虽这么说,你可以通过一个返回两个可能对象之一的类(基于你的布尔值)来获得你想要的行为。它们都有相同的方法,但操作方式不同(就像你的两个函数一样)。

Class A:
     def method():
          do things one way

Class B:
     def method():
          do things another way

     import A,B
Class Factory:
     def __init__(bool):
          self.printer = A if bool else B

     def do_thing():
          self.printer.method()




import Factory
fac = Factory(True)
fac.do_thing() # does A thing
fac = Factor(False)
fac.do_thing() # does B thing