【问题标题】:How to bind "typing_extensions.Literal" into another module so that it can be imported from that module?如何将“typing_extensions.Literal”绑定到另一个模块,以便可以从该模块导入?
【发布时间】:2021-12-25 04:38:38
【问题描述】:

为了减少我的导入次数,我试图在一个专用模块中绑定一些打字别名,例如colour.utilities.hints.

在该模块中,出于兼容性原因并且因为我仍在运行 Python 3.7,我尝试将 typing_extensions.Literal 绑定到新的 Literal 属性:

color/utilities/hints.py

import typing_extensions

Literal = typing_extensions.Literal

然后我使用bound属性如下:

color/utilities/array.py

from typing import Optional, Union

from colour.utilities.hints import ArrayLike, NDArray, Literal

# ...

def orient(a: ArrayLike,
           orientation: Literal['Flip', 'Flop', '90 CW', '90 CCW', '180']
           ) -> Union[NDArray, None]:
    orientation = validate_method(orientation,
                                  ['Flip', 'Flop', '90 CW', '90 CCW', '180'])

    if orientation == 'flip':
        return np.fliplr(a)
    elif orientation == 'flop':
        return np.flipud(a)
    elif orientation == '90 cw':
        return np.rot90(a, 3)
    elif orientation == '90 ccw':
        return np.rot90(a)
    elif orientation == '180':
        return np.rot90(a, 2)
    else:
        return None

当我输入检查模块时:

colour/utilities/array.py:1077: error: Variable "colour.utilities.hints.Literal" is not valid as a type
colour/utilities/array.py:1077: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
colour/utilities/array.py:1077: error: Name "Flip" is not defined
colour/utilities/array.py:1077: error: Name "Flop" is not defined
colour/utilities/array.py:1077: error: Invalid type comment or annotation

colour/utilities/array.py 中导入typing_extensions.Literal 并直接使用它就可以了。

【问题讨论】:

    标签: python typing


    【解决方案1】:

    只是稍微改进的建议,但您不需要明确定义新的Literal 变量。例如,您还可以如下定义您的 hints.py 模块:

    __all__ = [
        'Literal',
        # ...
    ]
    
    try:
        from typing_extensions import Literal
    except ImportError:
        from typing import Literal
    

    然后在另一个模块中:

    from hints import Literal
    

    【讨论】:

    • 明确定义它对 Flake8 有帮助,并更好地显示意图。 Try/Except 子句是个好主意,不过应该颠倒过来,尝试从typing 导入,并在出现异常时返回typing_extensions
    【解决方案2】:

    修改绑定
    import typing_extensions
    
    Literal = typing_extensions.Literal
    

    from typing_extensions import Literal
    
    Literal = Literal
    

    解决了这个问题,但我不完全确定为什么。

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2022-12-10
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多