在 python 中进行多次分派的简单方法? (没有外部图书馆或 class 建筑?)

Simple way to do multiple dispatch in python? (No external libraries or class building?)

我正在编写一个一次性脚本来计算我正在 运行 的一些模拟的一些分析解决方案。

我想以一种基于其输入计算正确答案的方式实现一个函数。例如,假设我有以下数学方程式:

tmax = (s1 - s2) / 2 = q * (a^2 / (a^2 - b^2))

对我来说似乎很简单,我应该能够做这样的事情:

def tmax(s1, s2):
    return (s1 - s2) / 2

def tmax(a, b, q):
    return q * (a**2 / (a**2 - b**2))

我可能已经习惯了在 julia 中写作,但我真的不想让这个脚本变得过于复杂。

您可以使用可选参数执行此操作:

def tmax_2(s1, s2):
    return (s1 - s2) / 2

def tmax_3(a, b, q):
    return q * (a**2 / (a**2 - b**2))

def tmax(a, b, c=None):
    if c is None:
        return tmax_2(a, b)
    else:
        return tmax_3(a, b, c)

在像 C++ 这样的静态类型语言中,您可以根据输入参数类型(和数量)重载函数,但这在 Python 中是不可能的。任何给定名称只能有 一个 函数。

可以做的是使用默认参数功能 select 中 的两个路径之一,类似于:

def tmax(p1, p2, p3 = None):
    # Two-argument variant has p3 as None.

    if p3 is None:
        return (p1 - p2) / 2

    # Otherwise, we have three arguments.

    return (p1 * p1 / (p1 * p1 - p2 * p2)) * p3

如果您想知道为什么我将平方运算从 n ** 2 更改为 n * n,那是因为后者更快(或者 是, 在过去的某个时候,至少对于像 2 这样的小整数幂 - 这 可能 仍然是这种情况,但你可能想要确认)。

一个可能的情况下g1 ** 2可能比g1 * g1更快g1是全局的而不是本地(Python VM 到 LOAD_GLOBAL 而不是 LOAD_FAST 需要更长的时间)。发布的代码不是这种情况,因为参数本质上是非全局的。