【问题标题】:Type Hinting: Argument Of Type Class [duplicate]类型提示:类型类的参数 [重复]
【发布时间】:2016-01-27 23:45:22
【问题描述】:

我正在定义一个方法

def foo_my_class(my_class: ???, bar: str) -> None:
    """ Operate on my_class """

我想知道,如何使用类型提示功能来指定应在第一个参数中传递的类。

基本上,我应该放什么而不是??? 标记?

这里还有一些代码可以更具体地说明我想要实现的目标。

class Base(object):
   """base class"""

class X(Base):
    """some class"""

class Y(Base):
    """some other class"""   

foo_my_class(X, "foo")    
foo_my_class(Y, "bar")

【问题讨论】:

    标签: python python-3.x type-hinting


    【解决方案1】:

    正如here 解释的那样,您可以使用Type:

    from typing import Type
    
    class X:
        """some class"""
    
    def foo_my_class(my_class: Type[X], bar: str) -> None:
        """ Operate on my_class """
    

    【讨论】:

      【解决方案2】:

      我可能是错的,因为我还没有在 Python 3.5 中感到沮丧和肮脏,但是看看 documentation 你应该可以用 typing.Optional 做到这一点。一个简单的例子。

      >>> from typing import Optional
      >>> 
      >>> class MyClass(object):
      >>>     def __init__(self):
      >>>         self.a = 1
      >>> 
      >>> O = Optional[MyClass]
      >>> 
      >>> def test(x: O) -> int:
      >>>     return x.a
      >>> 
      >>> myclass = MyClass()
      >>> print test(myclass)
      1
      

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        您只需使用类本身。

        def foo_my_class(my_class: MyClass, bar: str) -> None:
        

        来自the PEP(强调我的):

        类型提示可以是内置类(包括在标准库或第三方扩展模块中定义的类)、抽象基类、types 模块中可用的类型以及用户定义的类(包括标准库或第三方模块中定义的)。

        【讨论】:

        • 我已经更新了我的问题。如果我填充 my_class 参数是 Base 子类之一,您的解决方案似乎有效。在我的情况下没关系。但是,如果我需要让 my_class 接受任何类,我需要使用 type type (my_class: type, ...)
        • 我在 PyCharm 中尝试了您的答案,但在调用函数时收到警告:预期类型为 'MyClass',而得到了 'Type[SnapshotBookSubscriber]'。
        • 这是错误的 - 你在这里检查输入是 MyClass 的实例而不是 MyClass 类型本身
        • 这个解决方案是错误的,这是针对 MyClass 的实例,而不是针对 MyClass 的类或子类。 @roipoussiere 的回答是要走的路
        猜你喜欢
        • 2017-01-03
        • 2023-04-06
        • 2017-04-29
        • 2020-09-09
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        相关资源
        最近更新 更多