【问题标题】:Passing parameter into nested funtion将参数传递给嵌套函数
【发布时间】:2020-05-15 19:38:19
【问题描述】:

我有一个通过命令行参数设置的标志。该标志由嵌套许多层的函数使用。将该标志(或任何其他变量)传递给深度嵌套函数的pythonic方法是什么?像我在下面所做的那样将它添加到每个参数列表中感觉不对。

def func3(flag var3, var4):
...
# flag is used only here
 if flag;
   do something
 else:
 do something else

def func2(flag, var1, var2):
 ...
 x=func3(flag, c, d)

def func1(flag, var1, var2)
 ...
 y = func2(flag, a, b)


def def main():
...
parser.add_agrument('-f', '--flag', action='store_true' default=false)
...
result = func1(flag, foo, bar)

【问题讨论】:

  • 您不使用课程的任何特殊原因?如果您创建了一个类变量并将所有这些函数都设为类方法,则可以很容易地消除这种情况。
  • 如果 flag 只声明一次并且不改变,这可能是我建议使用全局变量的少数情况之一

标签: python parameter-passing


【解决方案1】:

如果您不想像其他人已经建议的那样使用 Class 并且需要一个不会让您更改代码的简单解决方法,请在该模块中使用全局变量,全部大写

另外,在我看来,这就像我们如何使用环境变量一样。单一变量,这是不言自明的,最不可能被任何人错误地更改。


def func3(var3, var4):
...
# flag is used only here
 if SOME_DISTINCT_FLAG;
   do something
 else:
 do something else

def func2(var1, var2):
 ...
 x=func3(c, d)

def func1(var1, var2):
 ...
 y = func2(a, b)


def def main():
...
parser.add_argument('-f', '--flag', action='store_true' default=false)
...
# this lets you access global variables
# without it, the variable will be of local scope
global SOME_DISTINCT_FLAG
SOME_DISTINCT_FLAG = flag
result = func1(foo, bar)

另外,您可以在顶部定义它以明确它是什么,并设置一个默认值。没有松散的结局。

【讨论】:

    【解决方案2】:

    考虑使用一个类:

    class Example:
    
        def __init__(self, flag, a, b, c):
            self.flag = flag   
            self.a = a
            self.b = b
            self.c = c
            self.d = d
    
        def func3(self):
            ...
            # flag is used only here
            if self.flag;
                do something
            else:
                do something else
    
        def func2(self):
            ...
            x=func3(self.flag, self.c, self.d)
    
        def func1(self)
            ...
            y = func2(self.flag, self.a, self.b)
    
    

    这样,您可以在任何嵌套深度访问类变量,而无需直接通过调用堆栈传递变量。这也使您可以在以后开发的其他方法中访问这些变量,而无需重新实例化这些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多