什么是好的 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 格式样式的主要内容,如果未能解决你的问题,请参考以下文章