作为一个几十年的程序员,我学到了一个很难的方法,即物理值将标记放在变量上是有意义的。在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/