Python-如何设置这行代码的样式?

Python-如何设置这行代码的样式?,python,Python,首先,我不确定这是否是这个问题的正确位置,所以如果有必要,请随意把它移到更合适的地方 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0])) 我有这行代码。Python PEP 8文档建议将行限制为79个字符,以保持较小屏幕上的可读性 哪种最优雅的方式可以使这一行代码符合PEP的建议 cmd_folder = os.path.realp

首先,我不确定这是否是这个问题的正确位置,所以如果有必要,请随意把它移到更合适的地方

cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
我有这行代码。Python PEP 8文档建议将行限制为79个字符,以保持较小屏幕上的可读性

哪种最优雅的方式可以使这一行代码符合PEP的建议

cmd_folder = os.path.realpath(os.path.abspath(os.path.split
                               (inspect.getfile
                                 ( inspect.currentframe() ))[0]))

这是最合适的方法吗?有没有我没有想到的更好的方法?

我会说,在您的示例代码中,将它们拆分为单独的操作更合适,而不是使代码更难阅读

aFile = inspect.getfile(inspect.currentframe())
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(aFile)[0]))
跟踪所有这些括号的开始和结束以了解每个临时变量发生了什么不应该是一件烦琐的事情。变量名可以通过命名结果的意图/类型来帮助提高清晰度

如果是两个,也许是3个嵌套调用,我可能会在一个调用中执行换行操作,但当你有大量的括号,并且列表索引挤在中间时,肯定不会。但通常我更倾向于使用像
foo.bar().biz().baz()
这样的链式调用,因为它是从左向右流动的


总是假设一些糟糕的随机开发人员明天必须阅读您的代码。

我倾向于这样做:

cmd_folder = os.path.realpath(os.path.abspath(os.path.split(
    inspect.getfile(inspect.currentframe()))[0]))
f = inspect.getfile(inspect.currentframe())
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(f)[0]))
在第一行末尾打开括号,并在续行上缩进。归根结底,这取决于你认为什么更具美感

进行部分计算并将结果保存在变量中也没有什么丢脸的,比如:

cmd_folder = os.path.realpath(os.path.abspath(os.path.split(
    inspect.getfile(inspect.currentframe()))[0]))
f = inspect.getfile(inspect.currentframe())
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(f)[0]))
我大体上同意(分成几个表达式)。但我想说明这个问题的另一个方面

通常,如果只是尝试正确地打断和缩进这一行,您还应该遵循:

每个缩进级别使用4个空格

对于您不想弄糟的非常旧的代码,您可以继续使用8个空格的制表符

连续行应该使用Python的隐式行垂直对齐包裹的元素,将括号、括号和大括号连接起来,或者使用悬挂缩进使用悬挂缩进时,应考虑以下因素:;第一行上不应有任何参数,应使用进一步的缩进,以清楚区分其作为续行。

[下面是几个例子]

因此,在您的情况下,它可能看起来像这样:

cmd_folder = os.path.realpath(os.path.abspath(os.path.split(
    inspect.getfile(inspect.currentframe()))[0]))
f = inspect.getfile(inspect.currentframe())
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(f)[0]))
第79列标记-->|
cmd_folder=os.path.realpath(
abspath(os.path.split(inspect.getfile(inspect.currentframe())[0]))
但正如我在开头提到的,正如我提到的:

平的比嵌套的好

稀疏比密集好

可读性很重要


因此,正如jdi所指出的,您应该明确地将代码分成几个表达式。

如果您真的坚持只保留一个表达式,我会选择“extreme”,因为它实际上看起来不错:

cmd_folder = os.path.realpath(
    os.path.abspath(
        os.path.split(
            inspect.getfile(
                inspect.currentframe()
        ))[0]
))

PEP-8反对函数调用中不必要的空格,例如,
realpath(os
+1)我完全支持切换到多个赋值。但是,如果出于某种原因确实需要,有一种方法可以按照PEP8以非常干净的方式写这一行(见我的答案).另外,jamylak关于空格的看法是正确的。空格消失了。我不知道我为什么在这里这么做。我在“PEP8 schmep 8”上与@wberry在一起在这个答案中。这是一个建议,而不是一条法律。这是一个让每个人都尝试并坚持通用格式标准的指南。最重要的部分是可读性。如果有人可以很容易地看到一行代码在做什么,那么你已经完成了你的工作。函数参数列表中的一个空格?Bah@jamylak:否,如果您参考的是swer(请参阅,尤其是“不使用垂直对齐时禁止在第一行上使用参数”部分,以及我的答案)。是的,如果您参考答案的第二部分(使用附加变量)。@Tadeck Ah ok我更喜欢第二个答案,但我错过了PEP-8的那部分,感谢您注意。PEP8,shmep-8。可读代码就是代码(tte)大厅对面的人可以阅读和理解。这是一个很好的评论,WBERY。我完全支持这个概念。这是一个指导原则,而不是一个要求。谢谢!虽然jdi的肯定很好,但你的评论指出了我在阅读政治公众人物时遗漏的悬空缩进部分。@TerryChia:谢谢。确实很好这确实是首选的方式(正如我在回答中多次指出的那样)。谢谢你给我的答案加上学分。我想,对于这样一个问题,你总会有一些人追求纯粹的可读性,或者那些主张PEP8的人。我不认为PEP8是最终目标,但有些人甚至在他们的IDLE上安装了PEP8验证程序。我想每个人都有自己的想法。