Python 输入有效的布尔组合

问题描述 投票:0回答:2

我正在尝试使用 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]]]")

我怎样才能做到这一点?

python mypy python-typing
2个回答
3
投票

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)

看来您只需要升级即可。


0
投票

最后,我采取了稍微不同的方向,试图以类型安全的方式捕获禁止/允许/必需的逻辑。

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

但是,我不会将此标记为答案,因为仍然存在为什么原始方法没有按预期工作的问题。

© www.soinside.com 2019 - 2024. All rights reserved.