编写干净高效Python代码的七个策略

1. 类型提示和注释

Python是一种动态类型的编程语言,在运行时推断变量类型。虽然它提高了灵活性,但在协作环境中大大降低了代码的可读性和可理解性。

Python支持函数声明中的类型提示,充当函数参数类型和返回类型的注释。尽管Python在运行时不强制执行这些类型,但它仍然很有帮助,因为它使您的代码更容易被其他人和您自己理解。

从一个基本的例子开始,这是一个带类型提示的简单函数声明:

 

Def sum(a: int, b: int) -> int:
Return a + b

在这里,尽管函数不言自明,但我们看到函数参数和返回值都表示为int类型。函数体可以是一行,也可以是几百行。然而,我们只需查看函数声明就能理解前置条件和返回类型。

其中,这些注释只是为了清晰和指引,它们并不在执行期间强制执行类型。所以,即使您传入不同类型的值,比如字符串而不是整数,函数仍然会运行。但是要小心:如果您不提供预期的类型,它可能会在运行时导致意外的行为或错误。比如在提供的示例中,函数sum()需要两个整数作为参数。但是如果您尝试添加一个字符串和一个整数,Python会抛出运行时错误。为什么?因为它不知道如何将字符串和整数相加!这就好比试图把苹果和橘子加在一起,那毫无意义。然而,如果两个参数都是字符串,它将毫无问题地将它们连接起来。

下面是带有测试用例的澄清版本:

 

print(sum(2,5)) # 7
# print(sum('hello', 2)) # TypeError: can only concatenate str (not "int") to str
# print(sum(3,'world')) # TypeError: unsupported operand type(s) for +: 'int' and 'str'
print(sum('hello', 'world')) # helloworld

用于高级类型提示的typing库

针对高级注释,Python包含typing标准库。不妨以一种更有趣的方式来看其用法。


from typing import Union, Tuple, List
import numpy as np
def sum(variable: Union[np.ndarray, List]) -> float:
	total = 0
	# function body to calculate the sum of values in iterable
	return total

这里,我们修改了同一个求和函数,它现在接受numpy数组或列表iterable。它计算并以浮点值的形式返回它们的和。我们利用typing库中的Union注释来指定变量参数可以接受的可能类型。

不妨进一步更改函数声明,以显示列表成员还应该是类型float。


def sum(variable: Union[np.ndarray, List[float]]) -> float:
	total = 0
	# function body to calculate the sum of values in iterable
	return total

这些只是帮助理解Python中的类型提示的一些入门示例。随着项目规模扩大,代码库变得更模块化,类型注释显著地增强了可读性和可维护性。typing库提供了一组丰富的特性,包括可选的各种iterable、泛型以有力支持自定义类型的功能,使开发人员能够精确而清晰地表达复杂的数据结构和关系。

2. 编写防御函数和输入验证

尽管类型提示似乎很有帮助,但它仍然容易出错,因为未强制执行注释。这些只是开发人员的额外文档,但如果使用不同的参数类型,函数仍然会执行。因此,需要以一种防御性的方式为函数和代码强制执行前置条件。因此,我们手动检查这些类型,违反条件时抛出适当的错误。

下面的函数显示了如何使用输入参数计算利息。

 
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔向理想的星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值