提升 Python 代码水平的 5 个方法

liftword1周前 (05-02)技术文章6

这是原始函数:

from datetime import datetime

def is_legal_age(dob_str):
    """Checks if a person with the given DOB is a legal adult (18+).
    Args:
        dob_str: The date of birth in the format YYYY-MM-DD.
    Returns:
        True if the person is a legal adult, False otherwise.
    """
    try:
        dob = datetime.strptime(dob_str, '%Y-%m-%d')
    except ValueError:
        return False
    today = datetime.today()
    age = today.year - dob.year - ((today.month, today.day) < dob.month dob.day return age>= 18

虽然该代码片段很实用,但仍有改进的空间。让我们深入探讨可以进行增强以符合 Python 最佳实践的五个领域。

1. 使用类型提示来保持清晰

添加类型提示可以使函数的签名更具描述性且更易于理解。它阐明了预期的输入和输出类型,这在协作或维护代码时特别有用。

更新的函数签名:

def is_legal_age(dob: str) -> bool:

现在,任何阅读该函数的人都会立即知道它需要一个字符串并返回一个布尔值。

2. 分解复杂的计算

长的、嵌套的计算可能难以阅读和调试。将它们分解为更小的变量可以增强可读性。

原始片段:

age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day))

改进版本:

is_before_birthday = (today.month, today.day) < (dob.month, dob.day)
age = today.year - dob.year - is_before_birthday

现在,每个变量代表计算中的一个不同步骤,使逻辑更加清晰。

3. 缩短代码长度

过长的功能可能难以在屏幕上显示,从而更难掌握整体逻辑。通过整合相关逻辑并利用Python的特性,我们可以在不牺牲清晰度的情况下保持函数简洁。

例子:

from datetime import datetime

def is_legal_age(dob: str) -> bool:
    """Checks if a person with the given DOB is a legal adult (18+)."""
    try:
        dob = datetime.strptime(dob, '%Y-%m-%d')
    except ValueError:
        return False
    today = datetime.today()
    is_before_birthday = (today.month, today.day) < dob.month dob.day age='today.year' - dob.year - is_before_birthday return age>= 18

该版本足够短,可以适应标准屏幕尺寸,同时保持易于阅读。

4. 优雅地处理错误

对于无效日期返回False是可行的,但并不理想。最好通过提出异常或记录问题来提供有意义的反馈。这使得调试更加容易,并有助于确保正确使用该函数。

改进的错误处理:

try:
   dob = datetime.strptime(dob, '%Y-%m-%d')
except ValueError as e:
   raise ValueError(f"Invalid format:{dob} Expected YYYY-MM-DD.") from e

现在,错误消息明确指出出了什么问题,从而改善了用户反馈。

5. 编写符合最佳实践的文档字符串

文档字符串应该简洁但信息丰富。使用它们以对读者立即有用的方式描述函数的目的、参数和返回值。

更新的文档字符串:

    """Determine if a person is a legal adult based on their date of birth.

    Args:
        dob: The date of birth as a string in YYYY-MM-DD format.

    Returns:
        True if the person is 18 years or older, False otherwise.

    Raises:
        ValueError: If the date of birth is not in the expected format.
    """

此更新的文档字符串删除了冗余并明确提及了引发的异常。

最终改进功能

这是完全更新和完善的功能:

from datetime import datetime

def is_legal_age(dob: str) -> bool:
    """Determine if a person is a legal adult based on their date of birth.
    Args:
        dob: The date of birth as a string in YYYY-MM-DD format.
    Returns:
        True if the person is 18 years or older, False otherwise.
    Raises:
        ValueError: If the date of birth is not in the expected format.
    """
    try:
      dob = datetime.strptime(dob, '%Y-%m-%d')
    except ValueError as e:
      raise ValueError(f"Invalid format:{dob} Expected YYYY-MM-DD.") from e

    today = datetime.today()
    is_before_birthday = (today.month, today.day) < dob.month dob.day age='today.year' - dob.year - is_before_birthday return age>= 18

结论

编写干净的 Python 代码是一个不断完善的过程。通过添加类型提示、分解复杂逻辑、缩短函数长度、优雅地处理错误以及改进文档字符串,您可以提高代码质量。这些原则不仅使您的代码更加 Pythonic,而且还确保从长远来看更容易维护和调试。

相关文章

超全攻略:用 pip 一键升级所有 Python 包

宝子们,你是否在为一个个升级 Python 包而烦恼?今天就给大家分享用 pip 升级所有 Python 包的多种方法,赶紧码住!注意事项升级依赖包可能会让你的应用程序出问题,所以在操作之前,最好用...

Python小技巧:如何批量更新已安装的库?

众所周知,升级某个库(假设为 xxx),可以用pip install --upgrade xxx 命令,或者简写成pip install -U xxx 。如果有多个库,可以依次写在 xxx 后面,以空...

主编推荐 | Gurobi 并行计算的设置和操作(附代码)

『运筹OR帷幄』原创作者:运筹OR帷幄编者按实际应用问题往往具有较高的计算复杂度,而优化算法难以在实际中落地的主要瓶颈就在于无法满足实际问题对计算时间的苛刻要求。然而近年来随着计算力的蓬勃发展,并行计...

升级到PyTorch 2.0的技巧总结(pytorch的最新版本)

来源:DeepHub IMBA本文约6400字,建议阅读12分钟在本文将演示 PyTorch 2.0新功能的使用,以及介绍在使用它时可能遇到的一些问题。PyTorch 2.0 发布也有一段时间了,大家...

Python pip升级及升级失败解决方案

本教程用于Python pip升级及失败解决方案首先查看脚本pip show pip我已经升级到了最新的版本安装其他模块过程中出现下面提示,便说明你需要升级pipYou are using pip v...