代码风格外文翻译资料

 2023-03-15 04:03

代码风格

关键词:python,代码规范,惯用语,PEP 8

如果你问Python程序员他们最喜欢Python的什么,他们通常会提到它的高可读性。事实上,高可读性是Python语言设计的核心,人们认识到,读代码比写代码要频繁得多。

Python代码的可读性高的一个原因是它的相对完整的代码风格指导方针和“Python化”的惯用语。

当一个经验丰富的Python开发人员(Pythonista)调用代码中非“Pythonic”部分时,他们通常意味着这些代码行没有遵循通用的指导原则,无法以被认为是最好的(听起来是:最易读的)方式表达其意图。

在一些边界情况下,对于如何在Python代码中表达意图没有达成一致的最佳方式,但这种情况很少见。

基本概念

显式代码

虽然Python可以使用任何形式的写法,但最好使用最明确、最直接的方式。

坏的:

def make_complex(*args):

x, y = args

return dict(**locals())

好的:

def make_complex(x, y):

return {x: x, y: y}

在上面的第二种代码中,调用者显式地接收x和y,并返回显式字典。使用此函数的开发人员通过阅读第一行和最后一行确切地知道要做什么,而与此相反的是坏的例子。

每行一条语句

而一些复合语句,如列表推导式,则因其简洁而受欢迎在同一行代码中有两个不相连的语句是不好的做法。

坏的:

print(one); print(two)

if x == 1: print(one)

if lt;complex comparisongt; and lt;other complex comparisongt;:

# do something

好的:

print(one)

print(two)

if x == 1:

print(one)

cond1 = lt;complex comparisongt;

cond2 = lt;other complex comparisongt;

if cond1 and cond2:

# do something

函数参数

参数可以通过四种不同的方式传递给函数。

  1. 位置参数是必须的,没有默认值。它们是最简单的参数形式。它们可以用于少数函数参数,这些参数完全是函数含义和顺序的一部分。是自然的。例如,在send(message, recipient)或point(x, y)中,函数的用户很容易记住这两个函数需要两个参数,以及它们的顺序。

在这两种情况下,调用函数时可以使用参数名,这样做可以切换参数的顺序,调用实例send(recipient=World,message=Hello)和point(y=2,x=1),但与更直接的调用相比,这降低了可读性,而且不必要地冗长了函数的参数send(Hello, World)和point(1,2)。

  1. 关键字参数不是必须的的,有默认值。它们通常用作可选参数发送到函数。当一个函数有两个或三个以上的位置参数时,它的签名就更多难以记住的和用关键字参数的默认值是有帮助的。比如,一个比较完整的send函数可以定义为send(message, to, cc=None, bcc=None). 这里cc和bcc是可选的,,并在没有传递另一个值时计算为None。

在Python中,调用带关键字参数的函数有多种方式;例如,可以遵循定义中参数的顺序,而不显式地命名参数,例如send(Hello,World, Cthulhu, God), 给上帝送去一份盲抄本,也可以用另一种顺序来命名参数,比如send(Hello again, World, bcc=God, cc=Cthulhu)。如果没有任何强烈的理由不遵循与函数定义最接近的语法时,最好避免这两种可能性:

send(Hello, World, cc=Cthulhu, bcc=God)。

附注:遵循YAGNI原则,删除“以防万一”且似乎从未使用过的可选参数(及其函数内的逻辑)通常比在需要时添加新的可选参数及其逻辑更难

  1. 任意参数列表是将参数传递给函数的第三种方法。如果使用带有可扩展位置参数的签名更好地表达函数意图,则可以使用*args构造来定义它。在函数体中,args将是所有剩余位置参数的元组。例如,send(message, *args)可以接收任意数量的参数用于调用:send(Hello, God, Mom, Cthulhu),在函数体中args将等于(God, Mom, Cthulhu)。

然而,这种结构有一些缺点,应该谨慎使用。如果一个函数接收到一个具有相同性质的参数列表,将其定义为一个参数的函数通常会更清晰,该参数为列表或任何序列。在这里,如果send有多个收件人,最好明确定义它:sendsend(message, recipients),并用send调用它send(Hello, [God, Mom, Cthulhu])。这样,用户的函数就可以预先将接收方列表操作为列表,这样就可以传递任何不能解包为其他序列的序列,包括迭代器。

  1. 任意关键字参数字典是将参数传递给函数的最后一种方法。如果函数需要一系列未确定的命名参数,可以使用**kwargs构造。在函数体中,kwargs将是函数签名中未被其他关键字参数捕获的所有传入的已命名参数的字典。

出于类似的原因,在使用任意参数列表的情况下同样需要谨慎:这些强大的技术是在被证明有必要使用它们时使用的,如果更简单和更清晰的结构足以表达函数的意图,则不应该使用它们。

由编写函数的程序员决定哪些参数是位置参数,哪些参数是可选关键字参数,以及决定是否使用任意参数传递的高级技术。如果明智地遵循了上面的建议,那么编写以下Python函数是合适的和令人愉快的:

  • 易于阅读(名称和参数不需要解释)
  • 易于更改(添加新的关键字参数不会破坏代码的其他部分)

避开魔杖

对于黑客来说,Python是一个强大的工具,它提供了一组非常丰富的钩子和工具,允许您执行几乎任何类型的入侵诡计。例如,可以做到以下每一项:

  • 更改对象创建和实例化的方式
  • 改变Python解释器导入模块的方式
  • 在Python中嵌入C例程是可能的(如果需要的话推荐)。

然而,所有这些选择都有许多缺点,最好使用最直接的方法来实现你的目标。主要缺点是使用这些结构时可读性会受到很大的影响。许多代码分析工具,如pylint或pyflakes,将无法解析这个“神奇的”代码。

我们认为Python开发人员应该了解这些近乎无限的可能性,因为它会让人相信不会出现无法解决的问题。然而,知道如何,尤其是什么时候不使用它们是非常重要的。

就像功夫大师一样,Python大师(Pythonista)知道如何用一根手指杀人,但从不真正动手。

我们都是负责任的用户

如上图所示,Python允许许多技巧,其中一些可能是危险的。一个很好的例子是,任何客户端代码都可以覆盖对象的属性和方法:在Python中没有“private”关键字。“我们都是负责任的用户”这句话表达了微软的理念,它与Java等高度防御性的语言截然不同,Java提供了很多机制来防止任何滥用。

例如,这并不意味着没有属性被认为是私有的,也不意味着在Python中不可能进行适当的封装。相反,Python社区不依赖开发人员在代码和其他代码之间竖起的混凝土墙,而是倾向于依赖一组约定,指示不应直接访问这些元素。

私有属性和实现细节的主要约定是在所有“内部”前加上下划线。如果客户端代码违反了这一规则并访问了这些标记元素,则在修改代码时遇到的任何错误行为或问题都是客户端代码的责任。

鼓励广泛使用此约定:任何不打算由客户端代码使用的方法或属性都应该用下划线作为前缀。这将保证更好的职责分离和更容易的修改现有代码;公开私有财产总是有可能的,但是将公共财产私有化可能会困难得多。

返回值

当一个函数变得越来越复杂时,在函数体中使用多个return语句是很常见的。然而,为了保持清晰的意图和可持续性的可读性,最好避免从正文中的许多输出点返回有意义的值。

在函数中返回值主要有两种情况:当函数被正常处理时返回的结果,以及表示错误的输入参数或函数不能完成计算或任务的任何其他原因的错误情况。

如果您不希望出现第二种情况抛出异常,那么可能需要返回一个值,例如None或False,表示函数不能正确执行。在这种情况下,最好在检测到不正确的上下文时尽早返回。它将有助于使函数的结构扁平化:return-because-of-error语句之后的所有代码都可以假定条件满足,从而进一步计算函数的主要结果。有多个这样的返回语句通常是必要的。

但是,当函数的正常过程中有多个主要出口时,调试返回的结果就变得很困难,因此最好保留单个出口。这也将有助于分解一些代码路径,多个出口点可能表明需要进行这样的重构。

def complex_function(a, b, c):

if not a:

return None # 抛出异常可能更好

if not b:

return None # 抛出异常可能更好

# 一些复杂的代码试图从a b c中计算x

# 如果成功,不要返回x

if not x:

# 一些关于x的Plan-B计算

return x # 返回值x的单个退出点将会有利于维护代码

惯用语法

简单地说,编程惯用语法是一种编写代码的方式。在c2Stack Overflow详细讨论了编程习惯用法的概念。

Python惯用语代码通常被称为Pythonic。

虽然通常只有一种——而且最

剩余内容已隐藏,支付完成后下载完整资料


英语原文共 11 页,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[595973],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

课题毕业论文、文献综述、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。