【问题标题】:Calling one of multiple inner functions from one of the outer variables function in python从python中的外部变量函数之一调用多个内部函数之一
【发布时间】:2021-02-04 15:17:09
【问题描述】:

鉴于其中之一:

def operations(x, y, z):
  def add(x,y):
    return x+y
  def sub(x,y):
    return x-y
  return z(x,y)
--------------------------------------------------
def operations(x, y, z):
  if z == add:
    def add(x,y):
      return x+y
  if z == sub:
    def sub(x,y):
      return x-y
  res = z(x,y)
  return res

我正在尝试从 python 中的外部变量函数之一调用多个内部函数之一,但出现以下错误:

result = operations(10,5,add)
=>
NameError: name 'add' is not defined
--------------------------------------------------
result = operations(10,5,"add")
=>
TypeError: 'str' object is not callable

我知道我可以使用这个解决方案:

def add(x,y):
  return x+y
def sub(x,y):
  return x-y
def operations(x, y, z):
  return z(x,y)

但对我来说,使用 嵌套 函数似乎更清晰。

我也读过这个: Short description of the scoping rules? 但这并没有真正帮助我。

【问题讨论】:

  • 为什么你认为嵌套函数更清晰?每次调用operations 时,您都在重新定义这些函数。当operations 本身被定义时,它们不会被定义一次。
  • 如果要将它们隔离到自己的命名空间中,请使用类。

标签: python python-3.x function scope


【解决方案1】:

每次调用operations 时,您当前的方法都不必要地重新定义addsubtract 等,而不仅仅是在定义operations 时重新定义一次。如果您想将各个操作隔离到它们自己的命名空间,请使用类。

class OperatorApplication:
    @staticmethod
    def add(x, y):
        return x + y
    
    @staticmethod
    def subtract(x, y):
        return x - y

OperatorApplication.add(x, y)

【讨论】:

  • 感谢您让我意识到不必要的重新定义和 class 技巧!
【解决方案2】:

这是我能想到的:

def operations(x, y, z: str): 
    def add(x, y): return x + y
    def sub(x, y): return x - y
    # ...
    
    if z == 'add':
        return add(x, y)

    elif z == 'sub':
        return sub(x, y)

    # elif ...
    
    else:
        print(f'Sorry, {z} is not a valid function.')
        return

让我们分解代码:

    def add(x, y): return x + y
    def sub(x, y): return x - y
    # ...

这定义了我们可以使用的所有功能。 注意:我只写了一行以使所有内容更加简洁。这没有必要。

    if z == 'add':
        return add(x, y)

    elif z == 'sub':
        return sub(x, y)

    # elif ...

这些是我们解析 z 并返​​回我们的值的地方。这些可以根据您的需要进行。

    else:
        print(f'Sorry, {z} is not a valid function.')
        return

这只是用户进入无效操作的基本情况。 例如,如果您运行 operations(2, 2, 'not_real_function') 将返回 Sorry, not_real_function is not a valid function.

【讨论】:

  • 感谢您详细的回答,但@chepner 让我意识到,每次调用外部函数时,我的方法都不必要地重新定义了每个内部函数。
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2012-07-14
  • 1970-01-01
相关资源
最近更新 更多