类型提示:类型类的参数 [重复]
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 类的构造函数[重复]