【问题标题】:How to create an inline function that modifies a variable in Python?如何在 Python 中创建一个修改变量的内联函数?
【发布时间】:2021-10-07 08:23:42
【问题描述】:

假设我有一个如下所示的类:

class Foo:
    def __init__(self, method):
        self.method = method

    def do_action(self):
        self.method()

我想按如下方式实例化它:

some_var = False

def bar():
    # Modifies existing variable's value
    global some_var
    some_var = True
foo = Foo(bar)

如何在不必定义 bar() 方法的情况下做到这一点? 我已经尝试了以下方法,但它不起作用。

foo = Foo(lambda: (some_var := True))

当我这样做时,IDE 会告诉我需要一个标识符。提前致谢!

编辑: 感谢那些回答的人,但是我并没有真正找到我需要的东西。不确定这是否是最佳实践,但我最终使用了 python 的 exec 并且它按预期工作:

foo = Foo(lambda: exec("some_var = True"))

【问题讨论】:

  • 您可能需要包含更多代码。 some_var 实际上应该是什么?您的示例 bar 是无操作的,因为 some_var 是一个局部变量。
  • 假设some_var是一个局部/全局变量,如果你真的,真的想要做这样的事情,你可以添加nonlocal some_varglobal some_var(每个都适合)到bar。但是这个问题听起来真的很像XY problem。您能否详细说明为什么要向修改局部/全局变量的对象添加方法?
  • @Samwise 它应该更改现有全局变量的值。我认为bar 中的评论就足够了,但我会添加一个声明。
  • 哦,这太恶心了,您必须使用 globals() 才能在 lambda 中修改它。不要这样做海事组织。全局变量已经够糟糕了,没有像这样不必要的奇怪恶作剧。

标签: python function methods lambda parameter-passing


【解决方案1】:

如果想法是让bar 能够修改实例属性,则让bar 采用self 参数,以便do_action 可以告诉它它正在操作哪个实例。你不能在lambda 中进行变量赋值,所以使用__setattr__

class Foo:
    def __init__(self, method):
        self.method = method
        self.some_var = False

    def do_action(self):
        self.method(self)


foo = Foo(lambda self: self.__setattr__("some_var", True))
foo.do_action()
print(foo.some_var)  # True

【讨论】:

    猜你喜欢
    • 2023-02-04
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2022-11-10
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多