作为一个已有数十年历史的程序员,我学到了很难的方法,即将标签放入变量的物理价值是有道理的。在C或C ++中,我使用内联备注:
C中的代码
double /*MOhm*/ resistance(double R1 /*MOhm*/, double R2 /*MOhm*/){
return R1+R2;
}
评论目的:输入是MOhm,输出也是MOhm。
是否有一种优雅的Python方式来做同样的事情?由于没有内联评论,如何做到这一点?对我来说,拥有一个易于理解的代码对我来说非常重要。
答案 0 :(得分:2)
具体:定义一种类型(实际上是类型别名),它准确描述了您的期望。
captionStyle
(Python 3允许使用Unicode标识符,因此您可以使用它并编写
MOhm = float
def resistance(r1: MOhm, r2: MOhm) -> MOhm:
return r1 + r2
然而,# That's M\u2126, M + OHM SIGN
MΩ = float
def resistance(r1: MΩ, r2: MΩ) -> MΩ:
return r1 + r2
(Ω,GREEK CAPITAL LETTER OMEGA)和U+03a9
(Ω,OHM SIGN)最多难以分辨,所以我会在实际代码中避免使用这种标识符。 )
您可以更进一步,定义一个真正的新类型,像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
这样的工具会将它们视为不同的类,让您更加努力地工作
你的代码类型检查。当你意外发生单位错误时更难
必须具体说明你传递的价值。
答案 1 :(得分:1)