Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何定义参数的类型提示(参数的值是一个类,所有期望值都是某个类的子类)?_Python_Python 3.x_Arguments_Subclass_Typehints - Fatal编程技术网

Python 如何定义参数的类型提示(参数的值是一个类,所有期望值都是某个类的子类)?

Python 如何定义参数的类型提示(参数的值是一个类,所有期望值都是某个类的子类)?,python,python-3.x,arguments,subclass,typehints,Python,Python 3.x,Arguments,Subclass,Typehints,我想定义一个函数。它有一个值为类的参数。但并非所有类都是预期的,只能传递某个类的某些子类 我不知道是否可以使用类型提示来实现这个期望 如果有,我怎么做 据我所知,类型提示仅在需要值是某个类型的实例时才有帮助。而且相关的文件也很差 类MyClass(对象): 通过 def my_功能(参数): #arg应该是MyClass的子类。 回来 我只希望我的函数的定义产生与类型hint相同的效果(唯一的区别是普通类型hint show value是某个类的实例,这里我希望它show value是某个类的

我想定义一个函数。它有一个值为类的参数。但并非所有类都是预期的,只能传递某个类的某些子类

我不知道是否可以使用类型提示来实现这个期望

如果有,我怎么做

据我所知,类型提示仅在需要值是某个类型的实例时才有帮助。而且相关的文件也很差

类MyClass(对象):
通过
def my_功能(参数):
#arg应该是MyClass的子类。
回来

我只希望我的函数的定义产生与类型hint相同的效果(唯一的区别是普通类型hint show value是某个类的实例,这里我希望它show value是某个类的子类).

如果您试图说
arg
必须是
MyClass
MyClass
的某个子类型的实例,请执行以下操作:

class MyClass(对象):通过
班级儿童(MyClass):通过
定义my_函数(arg:MyClass)->无:
通过
my_函数(MyClass())#类型检查
my_函数(Child())#类型检查
my_函数(3.14)#不进行类型检查

如果您试图说
arg
必须是
MyClass
类对象或子类型,请使用
typing.Type

从键入导入类型
#…剪断。。。
def my_function_2(arg:Type[MyClass])->None:
通过
my_函数_2(MyClass)#类型检查
my_function_2(儿童)#类型检查
my_function_2(int)#不进行类型检查
my_函数_2(MyClass())#不进行类型检查
当然,类型检查器无法准确地判断函数本身使用的子类型

类型提示仅在要求值是特定类型的实例时才有帮助

这其实不是你能做的。不可能构造一个类型提示来断言某些值必须恰好是一个类型,而不是该类型的任何子类型(尽管您通常可以通过使用泛型来模拟类似的类型)

类型提示总是指示某个值是该类型的实例或某个子类型

而且相关的文件也很差

如果你还没有找到它们,你可能会发现阅读它们很有用

Mypy是一个符合PEP 484的静态类型检查器,与PEP 484本身并行开发。(例如,mypy核心开发人员编写了PEP 484和其他一些与打字相关的PEP。)


结果是mypy的文档通常比官方Python文档更有助于打字。

Hi@AudraJacot,在执行任何其他操作之前,您是否尝试过使用
issubclass(class,classinfo)
检查arg是否是MyClass的子类。这可能会对你有所帮助你的论点是什么意思?你是指一个实际的类对象还是一个给定类的实例?@eapetcho,它不是一个类型注释,是python的一个相对较新的补充,它是一个运行时类型check@eapetcho,我知道这一点,但这不是我的目标。类型提示对于IDE非常友好,比如PyCharm。。。它可以在编程时为程序员提供一些交互式反馈。@juanpa.arrivillaga,一个实际的类对象。我相信他们想暗示它将是一个子类型,我最初认为它将指示一个绑定类型变量,
T=TypeVar(T,bound=MyClass)
,但我相信这也会接受
MyClass
对象,而OP似乎只希望接受子类型。