如何使用Python变量的值作为回调名称?

w51jfk4q  于 2022-10-22  发布在  Python
关注(0)|答案(3)|浏览(117)

编辑:下面是一个更复杂示例的简化代码。

def lottery(amount, callback=None):
    print(f'You spent {amount} on a lottery ticket.')
    if callback:
        callback(amount)

def win(amount):
    print(f'You won ${amount * 1000}!!!')

def lose(amount):
    print(f"Sorry, you spent {amount} and didn't win anything.")

编辑:“彩票”功能来自第三方软件包。我宁愿不修改他们的代码。
以下是有效的,但它们不是我想要的。

lottery(100, win)

输出:
你买彩票花了100英镑。你赢了10万美元!!!

lottery(100, callback=win)

输出:
你买彩票花了100英镑。你赢了10万美元!!!

lottery(100, lose)

输出:
你买彩票花了100英镑。对不起,你花了100英镑,没有赢得任何东西。

lottery(100, callback=lose)

你买彩票花了100英镑。对不起,你花了100英镑,没有赢得任何东西。

我正在寻找的是继续使用回调,让一个变量保持值“win”、“lose”、[编辑:或其他函数,如“win_1”、‘win_2’、…、‘win_n’或‘lose_1’、‘lose_2'、…、“lose_n”],并将该变量用作回调名称

如愿以偿的例子:

win_lose = 'win'
lottery(100, win_lose)

编辑:字符串“win”是动态构建的,如:

'win' + '_' + str(index)

'lose' + '_' + str(index)

愿望输出:
你买彩票花了100英镑。你赢了10万美元!!!

h7appiyu

h7appiyu1#

这可以完成工作:

def lottery(amount, win_lose):
    print(f'You spent {amount} on a lottery ticket.')
    if win_lose =="win":
        print(f'You won ${amount * 1000}!!!')
    if win_lose =="lose":
        print(f"Sorry, you spent {amount} and didn't win anything.")

# Example

win_lose = 'win'
lottery(100, win_lose)
juud5qan

juud5qan2#

你知道你可以把函数对象赋给变量,对吗?您只需执行win_lose = win(无引号),代码就会正常工作。如果需要一个包含函数名称的字符串,可以使用其__name__属性:如果该函数是传入回调函数,print(callback.__name__)将打印“win”。
否则,如果两个函数都在同一个模块上,您可以使用globals()返回的字典从其名称中检索functin对象-这正是您所要求的-我只是不确定这是否真的是您所需要的:

def lottery(amount, callback_name=None):
    callback = globals().get(callback_name)
    print(f'You spent {amount} on a lottery ticket.')
    if callback:
        callback(amount)

def win(amount):
    print(f'You won ${amount * 1000}!!!')

def lose(amount):
    print(f"Sorry, you spent {amount} and didn't win anything.")
s4n0splo

s4n0splo3#

一个适合我的解决方案是创建一个空的“win_lose()”函数,并将函数外部的“global()[]”字典分配给“win_loce”,如下所示。

def lottery(amount, callback=None):
    print(f'You spent {amount} on a lottery ticket.')
    if callback:
        callback(amount)

def win_lose(amount): pass

def win(amount):
    print(f'You won ${amount * 1000}!!!')

def lose(amount):
    print(f"Sorry, you spent {amount} and didn't win anything.")

检查每个功能的内存地址:

print(f'id(win_lose): {id(win_lose)}, id(win): {id(win)}, id(lose): {id(lose)}')

id(win_lose):1668264920544,id(win):1668164920832,id(lose):1668264921696

win_lose = globals()['lose']
print(f'id(win_lose): {id(win_lose)}')

id(win_lose):1668264921696

lottery(100, win_lose)

你买彩票花了100英镑。对不起,你花了100英镑,没有赢得任何东西。

win_lose = globals()['win']
print(f'id(win_lose): {id(win_lose)}')

id(win_lose):1668264920832

lottery(100, win_lose)

你买彩票花了100英镑。你赢了10万美元!!!
这种方法有哪些缺陷?

相关问题