什么是好的 Python 格式样式

Posted

技术标签:

【中文标题】什么是好的 Python 格式样式【英文标题】:What is a good Python format style 【发布时间】:2010-09-24 19:27:00 【问题描述】:

我创建了一个小的 python 脚本来在我用于测试的两个文件之间切换。

我的问题是,以下代码的好的 Python 格式样式是什么:

import filecmp
import shutil

local = "local.txt"
remote = "remote.txt"
config_file = "C:\some\path\file.txt"

shutil.copyfile( remote if( filecmp.cmp(local, config_file ) ) else local, config_file  )

或者

shutil.copyfile( remote 
                     if( filecmp.cmp(local, config_file ) ) 
                     else local,
                 config_file  )

或者

tocopy = remote if( filecmp.cmp( local, config_file ) ) else local 
shutil.copyfile( tocopy, config_file )

还是什么?

另外,在 python 中为多词名称命名 var 的首选方式是“to_copy”、“tocopy”、“toCopy”、“ToCopy”

【问题讨论】:

有很多关于相关主题的问题。例如,请参阅***.com/questions/159720/…。 实际上问题在于python的if:else:“三元”,但是一旦到这里,为什么不重新询问var名称。谢谢你的链接 对我来说,'y if x else z' 对我来说太没意思了。将其拆分为 Greg 所展示的 if/else。 小心使用反斜杠 - 请记住,它们被视为转义符,因此如果您的路径是“C:\some\path\test.txt”,您会摸不着头脑,直到您意识到它试图打开“路径[TAB]est.txt”。最好使用正斜杠,否则,使用 \\ 或原始字符串转义。 @Brian:真的吗?我认为这是优于其他语言的优势。您知道为什么会这样吗? (不是吗?:-/) 【参考方案1】:

对于条件语句,我可能会选择:

if filecmp.cmp(local, config_file):
    shutil.copyfile(remote, config_file)
else:
    shutil.copyfile(local, config_file)

在这种情况下几乎不需要使用内联 y if x else z,因为周围的代码很简单。

【讨论】:

那么你是说代码复杂时使用 y if x else z 吗? 我的想法正好相反,当代码很复杂时,我宁愿在 if:else: 分支中查看每一件事。 :) 嗯,至少对于 java,python 风格可能在这种情况下有所不同 :) @Vinko Vrsalovic:我同意内联“if”使语句更难阅读的评论。我认为“琐碎”可能是一个糟糕的词选择。但是原始帖子中的内联“if”很难阅读。 我的意思是周围的代码足够简单,不用担心重复它(DRY 原则)。如果它是一个更复杂的表达式,我会担心复制太多代码,并且可能会使用临时变量(如您的第三个提案)。 我更喜欢干,要么支付三元的成本,要么封装shutil.copyfile【参考方案2】:

来自Python Style Guide:

关于列出复合表达式:

一般不鼓励复合语句(同一行上的多个语句)。

是的:

if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()

或者对于您提供的代码,Greg 的示例是一个很好的示例:

if filecmp.cmp(local, config_file):
    shutil.copyfile(remote, config_file)
else:
    shutil.copyfile(local, config_file)

而不是:

if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()

方法名称和实例变量

使用函数命名规则:单词小写,必要时用下划线分隔以提高可读性。

更新:根据 Oscar 的要求,还列出了他的代码在这种方式下的外观。

【讨论】:

【参考方案3】:

第三个选项对我来说看起来最自然,尽管您在侧括号和多余括号中使用空格与 Python style guide 相矛盾。

该指南还回答了 to_copy 问题,但我可能会完全使用更清晰的名称。

我会这样写:

import filecmp
import shutil

local = "local.txt"
remote = "remote.txt"

destination = r"C:\some\path\file.txt"
source = remote if filecmp.cmp(local, destination) else local

shutil.copyfile(source, destination)

【讨论】:

如果您好奇,目标字符串中的前导 r 表示它是“原始字符串”。所以,是的,这是故意的。所以......不要删除它;) 哈哈!他提出了与我提出的相同的解决方案,但他得到了 3 个赞成票。太棒了:-) 我想补充一点,即使原始字符串是故意的,我真的认为这不是正确的解决方案。看看 Greg Hewgill 的答案更正确。【参考方案4】:

我见过的最常见的命名是下划线分隔的单词,to_copy。

至于格式样式,我没见过这样的约定。我发现

source = remote if filecmp.cmp(local, config_file) else local

shutil.copyfile(source, config_file)

在您的选择中最明确。

看到每个人都喜欢拆分 if 我至少封装了 copyfile 调用,以防您有一天希望更改它:

def copy_to(source, destination):
    shutil.copyfile(source,destination)

if filecmp.cmp(local, config_file):
    copy_to(remote, config_file)
else:
    copy_to(local, config_file)

【讨论】:

down_vote 的原因是什么?我的意思是,这种风格有什么问题? 您询问的是 Python 风格,这不符合 Python 的风格指南 - 对于 Python,可读性往往会取代简洁性。 人们不喜欢,可能是因为三元很新,伤了老蟒蛇的眼睛。我发现它足够清晰,可以避免重复复制文件。 没有必要将 shutil.copyfile 移到单独的函数中。它添加了一行代码,对理解没有任何帮助。如果您以后希望更改复制文件的方式,那么代码中的最后 4 行并不是只读的。 叹息。这个想法不是为了帮助理解。这是为了帮助可维护性。当然,修改两行而不是一行并不难,但只修改一行当然更容易,尤其是如果你将它替换为两行或三行或五行......【参考方案5】:

怎么样:

import filecmp
import shutil

local = "local.txt"
remote = "remote.txt"
config_file = "C:\some\path\file.txt"


if filecmp.cmp( local, config_file):
    to_copy = remote
else:
    to_copy = local


shutil.copyfile( to_copy, config_file  )

哎呀,这个开放的 id 网名看起来很糟糕。

【讨论】:

是的,不应该跳过给自己一个名字/昵称。 :)

以上是关于什么是好的 Python 格式样式的主要内容,如果未能解决你的问题,请参考以下文章

word第二讲(0806)

秀米编辑好的卡片如何更换样式

为啥 switch 语句上有奇怪的缩进?

React-Native 样式、布局、绘制

样式与主题2

python matplotlib线条样式,属性,格式调整