有没有办法将语句作为函数的参数传递?

时间:2021-07-15 16:45:53

标签: python

我正在尝试制作可以接受语句而不是普通数据类型的灵活方法。有没有办法做到这一点。这是一个简化的示例:

def function(*actions):
      for action in actions:
           action     

x = 5
y = 6        

function(x += 10, y *= 2)

当我尝试运行它时,Python 不会将 (x += 10) 或 (y *= 2) 确认为有效参数。有没有办法在不将这个功能分解成许多更小的功能的情况下实现我想要的?

3 个答案:

答案 0 :(得分:1)

不,但您可以传递函数。请注意,如果函数要修改非局部变量,则需要声明:

x = 5
y = 6

def increase_x():
    nonlocal x
    x += 10

def double_y():
    nonlocal y
    y *= 2

def function(*fs):
    for f in fs:
        f()

function(increase_x, double_y)

这有点乱,因为改变非局部变量很少是一个好主意;它可能会导致细微的错误,因为要知道从何处修改变量要困难得多。相反,您可以在类实例中保存可变状态:

class MyThing:
    def __init__(self):
        self.x = 5
        self.y = 6
    
    def increase_x(self):
        self.x += 10
    
    def double_y(self):
        self.y *= 2

def function(*fs):
    for f in fs:
        f()

my_thing = MyThing()
function(my_thing.increase_x, my_thing.double_y)

答案 1 :(得分:0)

Python 语法不允许你想要什么,但还有其他方法可以实现类似的目标。

所以,你想写一个这样的函数:

def function(*actions):
    for action in actions:
        action()

所以,顺便说一下,要调用它,您只能传入可调用对象。

以下是一些示例:

x = 5
y = 6

function(lambda:x+10, lambda: y*2)

不幸的是,这实际上并没有完成任何事情。

x = 5
y = 6

def xplus():
    global x
    x += 10
def doubley():
    global y
    y *= 2

function(xplus, doubley)
print(x,y)

输出:15 12

答案 2 :(得分:-1)

您只想使用 exec

def function(*actions):
    for action in actions:
        exec(action, globals())

x = 5
y = 6

function("x += 10", "y *= 2")
>>> print(f"{x=}, {y=}")
x=15, y=12