【问题标题】:How to specify that a function parameter should be of a specific data type?如何指定函数参数应该是特定的数据类型?
【发布时间】:2013-07-28 00:56:48
【问题描述】:

例如,如果您声明以下函数:

>>> def fun(a, b):
...     a.pop()
...     a.pop()
...     b.add(a.pop())
...     return b
... 

这个函数可以接收任何类型的数据,但假设我只想接收“set”类型的参数,因为在这个函数内部由于某种原因我需要使用方法 add() 和 pop()在任何“集合”中都可以找到。我怎么能说这个函数只接受'set'类型的参数呢?

【问题讨论】:

  • 如果有人想将它用于pop()add() 是有效操作但不是set 的类型怎么办?
  • 你不知道——它不是 Pythonic,而且是个坏主意。 Python 是围绕鸭子类型设计的——可以做什么比它的类型更重要。尝试做你想做的事,如果它不起作用,捕获异常。
  • @Lattyware 你应该用它作为答案,这是一个很好的观点。
  • 没错。这就是为什么 answer 不需要引发错误。默认行为已经引发了人类可读的错误。程序员可能正在考虑实现另一个函数来处理不同的类型。

标签: python types python-3.x parameters arguments


【解决方案1】:

我想如果你想分配一个类型。您可以在函数中执行此操作:

if not isinstance(item, set):
    raise TypeError()

否则,当发生非法操作时,您的代码将引发异常。这是合理的。或者,如果您不想要异常,可以将代码包装在 try...except 中:

try:
    ...
except:
    ...

【讨论】:

    【解决方案2】:

    您可以使用isinstance() 来检查类型:

    >>> def fun(a, b):
    ...     if not (isinstance(a, set) and isinstance(b, set)):
    ...         raise TypeError("Please only call this function with sets as the arguments")
    ...     a.pop()
    ...     a.pop()
    ...     b.add(a.pop())
    ...     return b
    

    【讨论】:

      【解决方案3】:

      使用以下内容:

       if isinstance(item, set):
           ...
      

      此函数返回布尔值。

      【讨论】:

        【解决方案4】:

        isinstance 是一种方式,正如其他人已经描述的那样。这自然需要结合良好的自动化测试。

        我相信您也可以使用 Cython,它具有用于函数/方法参数的可选类型声明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-11
          • 2022-06-18
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          • 2020-03-24
          • 2022-01-16
          • 2023-03-30
          相关资源
          最近更新 更多