作为一个几十年的程序员,我学到了一个很难的方法,即物理值将标记放在变量上是有意义的。在C或C++中,我用在线注释来做:
C中的代码

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

注释目的:输入为MOhm,输出为MOhm。
有没有一种优雅的蟒蛇方法来做同样的事?既然没有内联的评论,怎么能做到呢?对我来说,拥有一个可读的代码是非常重要的,它很容易被别人理解。

最佳答案

具体点:定义一个类型(实际上是类型别名),它准确地描述了您所期望的。

MOhm = float

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

(Python3确实允许使用Unicode标识符,因此您可以想象并编写
# That's M\u2126, M + OHM SIGN
MΩ = float

def resistance(r1: MΩ, r2: MΩ) -> MΩ:
    return r1 + r2

然而,U+03a9(Ω,希腊文大写字母OMEGA)和U+2126(Ω,欧姆符号)充其量很难区分,所以我会在实际代码中避免使用这种标识符
您可以更进一步,定义一个真正的新类型,像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 - Python3:与变量关联的单位度量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50761817/

10-11 08:34