Будьте конкретны: определите тип (на самом деле псевдоним типа), который точно описывает то, что вы ожидаете.
MOhm = float
def resistance(r1: MOhm, r2: MOhm) -> MOhm:
return r1 + r2
(Python 3 действительно допускает идентификаторы Unicode, так что вы можете получить фантазию и написать
# That's M\u2126, M + OHM SIGN
MΩ = float
def resistance(r1: MΩ, r2: MΩ) -> MΩ:
return r1 + r2
Однако, U+03a9
(Ω, ГРЕЧЕСКИЙ КАПИТАЛ ПИСЬМО ОМЕГА) и U+2126
(Ω, ОМ-ЗНАК) в лучшем случае трудно отличить друг от друга, поэтому я бы избегал такого рода идентификатора в реальном коде.)
Вы можете пойти еще дальше и определить real новый тип, который будут применяться такими инструментами, как 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
, однако, будут обрабатывать их как отдельные классы, заставляя вас усерднее работать, чтобы обеспечить проверку типов кода.Труднее случайно ошибиться в единицах измерения, когда вам нужно быть конкретным в отношении значений, которые вы передаете.