【问题标题】:function annotations in pythonpython中的函数注释
【发布时间】:2016-07-20 00:14:28
【问题描述】:

我刚刚发现了 python 3 (https://www.python.org/dev/peps/pep-3107/) 的函数注释,它似乎非常适合记录参数或返回类型。它还在我的 pycharm IDE 中提供了更好的智能感知。

我有一个关于输入类型模糊的参数的问题。例如,它可以是一个列表或 numpy 数组或一些“类似数组”的数量。将此类输入参数注释到函数的最佳方法是什么?示例:

import numpy as np

def fun(data: np.ndarray) # can also be a list
    pass

我还有另一种情况,输入可以是两种类型中的任何一种。示例:

def fun(header: Nifti1Header) # can also be Nifti2Header
    pass

记录这些类型的参数输入的最佳方式是什么?

【问题讨论】:

    标签: python pep8 pep


    【解决方案1】:

    如果你使用的是python3.5,最好的方法是使用typing.Union

    >>> from typing import Union
    >>> import numpy as np
    >>> def fun(data: Union[np.ndarray, list]):
            pass
    

    如果您一直使用 Union[t1, t2, ...],您也可以使用 typing.TypeVar。 (此外,您可以比代码中的许多联合更轻松地从 TypeVar 添加和删除类型)

    >>> from typing import TypeVar
    >>> import numpy as np
    >>> import array
    >>> Ar = TypeVar('Ar', np.ndarray, list, array.array)
    

    然后,此代码会将 Ar 与列表、array.arrays 和 numpy 数组相关联。

    【讨论】:

      【解决方案2】:

      您必须弄清楚您的功能所共享的合法输入有哪些共同财产。对于第一个,它看起来应该是可迭代的:

      >>> from collections import Iterable
      >>> def fun(data: Iterable):
      ...     pass
      ... 
      >>> isinstance(np.ndarray(0), Iterable)
      True
      >>> isinstance([], Iterable)
      True
      >>> isinstance(23, Iterable)
      False
      

      对于您的标题,它闻起来像 Nifti1HeaderNifti2Header 应该继承自一个公共基类。如果该函数应该适用于任何派生类,为什么不使用基类对其进行注释?

      【讨论】:

        猜你喜欢
        • 2015-11-04
        • 1970-01-01
        • 2020-01-28
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        相关资源
        最近更新 更多