Python3:与变量相关的单位度量



作为一个几十年的程序员,我学到了艰难的方法,物理值给变量加上标签是有意义的。在 C 或 C++ 中,我使用内联注释来执行此操作:

C 语言代码

double /*MOhm*/ resistance(double R1 /*MOhm*/, double R2 /*MOhm*/){
return R1+R2;
}

注释目的:输入是MOhm的,输出也是MOhm。

有没有一种优雅的 Python 方法来做同样的事情?既然没有内联评论,怎么能做到呢?对我来说,拥有一个可读的代码非常重要,它很容易被另一个人理解。

具体一点:定义一个类型(实际上是类型别名(,准确描述你的期望。

MOhm = float
def resistance(r1: MOhm, r2: MOhm) -> MOhm:
return r1 + r2

(Python 3 确实允许 Unicode 标识符,所以你可以花哨地写

# That's Mu2126, M + OHM SIGN
MΩ = float
def resistance(r1: MΩ, r2: MΩ) -> MΩ:
return r1 + r2

但是,U+03a9(Ω,希腊大写字母 omega(和U+2126(Ω,OHM SIGN(充其量很难区分,所以我会在实际代码中避免这种标识符。


您可以更进一步,定义一个真正的新类型,mypy等工具将强制执行。但是,这样做的运行时成本很小。

from typing import NewType
Ohm = NewType("Ohm", float)
MOhm = NewType("MOhm", float)
def resistance(r1: MOhm, r2: MOhm) -> MOhm:
return MOhm(r1 + r2)
x: Ohm = Ohm(3.0)
y: MOhm = MOhm(4.0)
# mypy error, resistance expects its first argument to have type MOHm, not OHm
print(resistance(x, y))

NewType是一个帮助函数,用于定义类,例如

class Ohm(float):
pass
class MOhm(float):
pass

在运行时,所有三个类的行为相同。但是,像mypy这样的工具会将它们视为不同的类,使您更加努力地确保 您的代码类型检查。当您不小心出现单位错误时,更难出错 必须具体说明您传递的值。

在 Python 中,您应该使用描述参数和返回值的函数文档字符串。例如,使用 sphinx 语法:

def resistance(r1: float, r2: float) -> float:
"""
Calculate resistance.
:param r1: resistance in MOhm
:param r2: resistance in MOhm
:returns: total resistance in MOhm
"""
return r1 + r2

标准格式的文档字符串可以由 IDE 解析,以为您提供有用的自动完成等。

最新更新