ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Python 中的可迭代陷阱

2022-11-07 15:20:28  阅读:360  来源: 互联网

标签:python 数据 语言 NumPy ipython shell 科学家 过滤器 Typehints


什么是可迭代对象?

Typehints从Python 3.5开始Python中
引入。作为此介绍的一部分,引入了
一个新模块,其中包含内置集合和抽象
基础 Classes.is 的各种类型,该类型在 PEP 中突出显示用于类型提示,并由许多最常用的 Python 集合实现。从 Python 3.9 开始,此类型可以从中导入并可用作类型和抽象基类。
typingIterablecollections.abc

何时使用可迭代对象?

如果您开始在 Python 中使用类型提示,并且一直遵循最佳实践来接受参数中可能的最通用类型,那么您可能一直在使用 .can 在您的代码期望变量实现的任何地方使用,换句话说,您的代码想要遍历某种集合的地方。IterableIterable__iter__

假设您要向多个收件人发送电子邮件:

class MailApi:
    def sendmail(self, sender: str, receiver: str, message: str) -> None:
        ...


api = MailApi()


def send_emails(message: str, sender: str, receivers: Iterable[str]) -> Optional[T]:
    if not receivers:
        raise ValueError("you need atleast one receiver")

    for receiver in receivers:
        api.sendmail(sender, receiver, message)

如果您使用以下代码发送电子邮件,您将发送电子邮件:

send_emails(
    "Hello",
    "me@example.com",
    ["steve@example.com", "larry@example.com", "elon@example.com"],
)

如果使用以下代码,将出现异常:

send_emails("Hello", "me@example.com", [])

陷阱

但是,如果您这样做呢?

send_emails(
    "Hello",
    "me@example.com",
    filter(
        lambda x: not x.endswith("example.com"),
        ["steve@example.com", "larry@example.com", "elon@example.com"],
    ),
)

您会直观地期望出现异常,因为过滤器将删除所有匹配的电子邮件,但什么都不会发生!

filter返回一个 validand MyPy 正确断言没有类型错误。这是怎么回事?Iterable

pythonic 的方法是检查集合是否为空。这是有效的,因为 Python 返回时返回。但是,不需要实施以及。默认的真值为 ,因此即使您的代码完全是类型安全的,它也不会执行您可能期望的操作。此问题的解决方案并不简单,但是如果要使用类型检查器捕获这些错误,则可以通过使用稍微不那么泛型的类型来防止类似的错误,例如,这确实需要实现。if not <collection_nameFalse__len__0Iterable__len____bool__TrueCollection__len__

结论

新的 Python 类型提示是该语言的一个受欢迎的补充,提高了可维护性,减少了错误,并允许对 Python 提供更好的编辑器支持。但是,由于历史设计决定,有一些微妙的情况可能会导致错误,其方式是你对类型安全代码所不期望的。如果你在 Python 中使用,请考虑使用。

标签:python,数据,语言,NumPy,ipython,shell,科学家,过滤器,Typehints
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有