【问题标题】:Python: Calling a function based on a argument valuePython:根据参数值调用函数
【发布时间】:2023-12-25 20:21:01
【问题描述】:

在我的主代码中,我想调用函数 X 而不管参数 v。在后台,根据 v 的值调用函数 Y 或 Z。

比如主代码是-

i = X(v)

现在,如果 v="a" 或 v="b",则调用函数 Y 或 Z。

def X(v):
    pass
def Y(v):
    # called if v="a"
def Z(v):
    # called if v="b"

我认为可以使用装饰器,但我对装饰器的了解不够。

【问题讨论】:

  • 是什么阻止你这样做?我不认为装饰器是必要的。在您的 X() 函数中,为什么不使用 if v == 'a': Y(v)elif v == 'b': Z(v)

标签: python python-decorators


【解决方案1】:

if 声明有什么问题吗?

def X(v):
    if v == "a":
        Y(v)
    elif v == "b":
        Z(v)    

【讨论】:

    【解决方案2】:

    最简单的方法是让X 致电YZX 将更像是一个调度程序而不是一个装饰器,它与你所拥有的相匹配(直接调用 X)。查看@ezig 对代码的回答。

    decorators 用于更改函数或其环境的某些内容,或注册它——通常不是选择不同的函数;尽管singledispatch 是一个明显的例外,但引入了into Python3.4

    我自己的代码中的 singledispatch 示例(使用称为 simplegeneric 的旧版本):

    @simplegeneric
    def float(*args, **kwds):
        return __builtin__.float(*args, **kwds)
    
    
    @float.register(timedelta)
    def timedelta_as_float(td):
        seconds = td.seconds
        hours = seconds // 3600
        seconds = (seconds - hours * 3600) * (1.0 / 3600)
        return td.days * 24 + hours + seconds
    
    
    @float.register(Time)
    def Time_as_float(t):
        return t.tofloat()
    

    然后我可以在timedeltas、自定义Times 或正常的东西上调用float(),然后得到一个浮点数。

    【讨论】:

    • 我认为 singledispatch 是我可能正在寻找的东西。 “if-elif”不是一个好选择,因为我有多个函数(X、Y、Z 只是示例)。
    • @user3267989:我添加了singledispatch的示例。
    • 谢谢伙计。我想这就是我想要的。