首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制python函数仅接受列表作为参数

限制python函数仅接受列表作为参数
EN

Stack Overflow用户
提问于 2019-09-06 11:36:38
回答 2查看 352关注 0票数 0

在python中是否可以限制python中的参数类型。我尝试使用输入中的List模块,但它仍然允许用户传递类对象或int参数,而不会给出错误。

代码语言:javascript
复制
 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)
EN

回答 2

Stack Overflow用户

发布于 2019-09-06 11:47:07

虽然类型注释是Python的一部分,但类型检查不是。注释用于启用外部静态类型检查。Python最常见的静态类型检查器是PyCharm编辑器和mypy

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

票数 1
EN

Stack Overflow用户

发布于 2019-09-06 11:51:11

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

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

代码语言:javascript
复制
def get_Job_Sequencing_with_deadlines(self, jobs):
    if not isinstance(jobs, list):
         raise TypeError('non-list input')
    print(type(jobs))

如果您不想允许子类,请改用if type(jobs) is not list:

检查列表中的每一项都同样令人痛苦:

代码语言:javascript
复制
if not all(isinstance(job, Job) for job in jobs):
    raise TypeError('non-Job input')

您几乎不想在Python中进行显式类型检查。这门语言在设计上基本上考虑到了鸭子类型的思想。这意味着应该允许那些行为方式符合您的需要,但不属于某些硬编码类层次结构的对象。从实际意义上讲,这是非常有意义的。如果它的行为像一个列表,你关心它不是吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57815388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档