类型提示:类型类的参数 [重复]

Posted

技术标签:

【中文标题】类型提示:类型类的参数 [重复]【英文标题】: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")

【问题讨论】:

【参考方案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 的回答是要走的路

以上是关于类型提示:类型类的参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用类作为其方法中参数的类型提示[重复]

为啥 C++ 标准中没有 std::string_view 类型的参数的 std::basic_string 类的构造函数[重复]

在C#中将类型参数传递给泛型[重复]

WebApi调用用提示404

具有相同名称但参数和返回类型不同的虚拟函数[重复]

使用类型提示指定多个类[重复]