我正在尝试使用 Python 的类型检查器来捕获不兼容的权限。我有一个许可情况,可以允许(布尔值)和要求(布尔值)特定操作。显然,我想排除既被禁止又被要求的情况,因为这是不可能的。
这是我尝试过的。
Permissions = Union[
Tuple[Literal[False], Literal[False]], # forbidden and not required
Tuple[Literal[True], Literal[False]], # permitted and not required
Tuple[Literal[True], Literal[True]] # permitted and required
# (No option for forbidden and required)
]
forbidden: Permissions = (False, False)
allowed: Permissions = (True, False)
required: Permissions = (True, True)
mypy_should_catch: Permissions = (False, True)
我希望 mypy 允许前三个,但不允许最后一个。
但是,我实际得到的是所有四个都出现这样的错误:
error: Incompatible types in assignment (expression has type "Tuple[bool, bool]", variable has type "Union[Tuple[Literal[False], Literal[False]], Tuple[Literal[True], Literal[False]], Tuple[Literal[True], Literal[True]]]")
我怎样才能做到这一点?
mypy 0.941 仅捕获最后一行:
$ mypy test.py
test.py:13: error: Incompatible types in assignment (expression has type "Tuple[bool, bool]", variable has type "Union[Tuple[Literal[False], Literal[False]], Tuple[Literal[True], Literal[False]], Tuple[Literal[True], Literal[True]]]") [assignment]
Found 1 error in 1 file (checked 1 source file)
看来您只需要升级即可。
最后,我采取了稍微不同的方向,试图以类型安全的方式捕获禁止/允许/必需的逻辑。
class Permissions(Enum):
FORBIDDEN = auto()
PERMITTED = auto()
REQUIRED = auto()
@property
def permitted(self) -> bool:
return self is not self.FORBIDDEN
@property
def required(self) -> bool:
return self is self.REQUIRED
但是,我不会将此标记为答案,因为仍然存在为什么原始方法没有按预期工作的问题。