作为一个几十年的程序员,我学到了艰难的方法,物理值给变量加上标签是有意义的。在 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 解析,以为您提供有用的自动完成等。