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

时间:2018-06-08 13:33:25

标签: python c python-3.x annotations comments

作为一个已有数十年历史的程序员,我学到了很难的方法,即将标签放入变量的物理价值是有道理的。在C或C ++中,我使用内联备注:

C中的代码

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

评论目的:输入是MOhm,输出也是MOhm。

是否有一种优雅的Python方式来做同样的事情?由于没有内联评论,如何做到这一点?对我来说,拥有一个易于理解的代码对我来说非常重要。

2 个答案:

答案 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)

在Python中,您应该使用描述参数和返回值的函数docstring。例如,使用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解析,为您提供有用的自动完成等。