将python函数限制为仅将列表作为参数

将python函数限制为仅将列表作为参数,python,python-3.x,Python,Python 3.x,在python中是否可以限制python中的参数类型。我尝试在键入时使用列表模块,但它仍然允许用户在不给出错误的情况下传递类对象或int参数 from typing import List class Job: def __init__(self): self.profit = 0 self.deadlines = 0 class JobsWithDeadlines: def get_Job_Sequencing_with

在python中是否可以限制python中的参数类型。我尝试在键入时使用列表模块,但它仍然允许用户在不给出错误的情况下传递类对象或int参数

 from typing import List

 class Job:
    def __init__(self):
            self.profit = 0
            self.deadlines = 0

 class JobsWithDeadlines:
    def get_Job_Sequencing_with_deadlines(self, jobs: List[Job]):
            print(type(jobs))


 j = Job()
 j.profit = 20
 j.deadline = 2
 obj = JobsWithDeadlines()
 obj.get_Job_Sequencing_with_deadlines(1)
虽然类型注释是Python的一部分,但类型检查不是。注释用于启用外部静态类型检查。Python最常见的静态类型检查器是PyCharm编辑器和

“静态”意味着在程序运行之前捕获错误,只需分析源代码。除了。

类型注释是Python的一部分,而类型检查不是,没有什么可以防止在运行时传递错误的对象。注释用于启用外部静态类型检查。Python最常见的静态类型检查器是PyCharm编辑器和


“静态”意味着在程序运行之前捕获错误,只需分析源代码。除了注释外,没有任何东西可以防止在运行时传递错误的对象。

注释
jobs:List[Job]
称为注释。注释为用户和IDE提供了一种编写提示的方法。注释在运行时存储在函数对象中,但不会对实际代码施加任何可强制执行的限制

要强制执行该限制,您必须手动检查它。例如,如果允许子类:

def get_Job_Sequencing_with_deadlines(self, jobs):
    if not isinstance(jobs, list):
         raise TypeError('non-list input')
    print(type(jobs))
如果您不想允许子类,请在type(jobs)不是list:时使用

检查列表中的每个项目同样痛苦:

if not all(isinstance(job, Job) for job in jobs):
    raise TypeError('non-Job input')

您几乎不想在Python中执行显式类型检查。该语言的设计基本上考虑了duck类型的概念。这意味着应该允许以您想要的方式运行但不属于某些硬编码类层次结构的对象。从实用角度讲,这是完全有道理的。如果它的行为类似于列表,您是否关心它是否是列表?

表示法
jobs:list[Job]
称为注释。注释为用户和IDE提供了一种编写提示的方法。注释在运行时存储在函数对象中,但不会对实际代码施加任何可强制执行的限制

要强制执行该限制,您必须手动检查它。例如,如果允许子类:

def get_Job_Sequencing_with_deadlines(self, jobs):
    if not isinstance(jobs, list):
         raise TypeError('non-list input')
    print(type(jobs))
如果您不想允许子类,请在type(jobs)不是list:
时使用

检查列表中的每个项目同样痛苦:

if not all(isinstance(job, Job) for job in jobs):
    raise TypeError('non-Job input')

您几乎不想在Python中执行显式类型检查。该语言的设计基本上考虑了duck类型的概念。这意味着应该允许以您想要的方式运行但不属于某些硬编码类层次结构的对象。从实用角度讲,这是完全有道理的。如果它的行为类似于一个列表,您是否关心它是否是列表?

您能否分享一个代码示例,因为我看到mypy库使用的是与我使用的相同的键入模块。实际上,我不能在我的代码中使用mypy,因为没有代码示例。您不应该在代码中使用mypy,正如我在回答中所解释的,它是一个静态代码分析器
mypy my_program.py
(从命令行)将检查您的代码。如果您的函数可能接收到错误类型的参数(给定它看到的代码),它将进行投诉;然后,如果您消除了静态分析器中的所有警告,则不需要运行时检查。您是否可以共享一个代码示例,因为我看到mypy库使用的是与我使用的相同的类型模块。实际上,我不能在我的代码中使用mypy,因为没有代码示例。您不应该在代码中使用mypy,正如我在回答中所解释的,它是一个静态代码分析器
mypy my_program.py
(从命令行)将检查您的代码。如果您的函数可能接收到错误类型的参数(给定它看到的代码),它将进行投诉;然后,如果消除静态分析器中的所有警告,则不需要运行时检查。