在 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
需要更长的时间)。发布的代码不是这种情况,因为参数本质上是非全局的。
我正在编写一个一次性脚本来计算我正在 运行 的一些模拟的一些分析解决方案。
我想以一种基于其输入计算正确答案的方式实现一个函数。例如,假设我有以下数学方程式:
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
需要更长的时间)。发布的代码不是这种情况,因为参数本质上是非全局的。