0

首先,我不确定 SO 是否适合这个问题,因此如有必要,请随时将其移至更合适的位置。

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]))

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

4

4 回答 4

5

我会说在您的示例代码的情况下,将它们分成单独的操作会更合适,而不是使代码更难阅读。

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

跟踪所有这些括号的开始和结束以弄清楚每个临时变量发生了什么不应该是一件苦差事。变量名称可以通过命名结果的意图/类型来帮助清晰。

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

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

于 2012-08-18T05:41:16.947 回答
4

我一般都接受 jdi 提供的答案(分成几个表达式)。但我想展示这个问题的另一个方面。

一般来说,如果只是试图正确地打破和缩进这一行,你还应该遵循PEP8 关于缩进的规则

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

对于您不想弄乱的真正旧代码,您可以继续使用 8 空格制表符。

续行应该使用 Python 的隐式行在括号、方括号和大括号内连接,或者使用悬挂缩进垂直对齐被包裹的元素。使用悬挂缩进时,应考虑以下事项;第一行不应该有任何参数,并且应该使用进一步的缩进来清楚地将自己区分为续行。

[以下几个例子]

因此,在您的情况下,它可能如下所示:

#---------------------------------------------------------79th-column-mark--->|
cmd_folder = os.path.realpath(
    os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0]))

但正如我在开头提到的,以及PEP20(Python 之禅)提到的:

平面优于嵌套。

稀疏比密集好。

可读性很重要。

因此,正如 jdi 所指出的,您绝对应该将代码拆分为几个表达式。

于 2012-08-18T05:58:44.520 回答
1

我倾向于这样做:

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]))
于 2012-08-18T05:45:49.747 回答
0

If you really insist on keeping it one expression, I'd go with an "extreme" simply because it actually looks nice:

cmd_folder = os.path.realpath(
    os.path.abspath(
        os.path.split(
            inspect.getfile(
                inspect.currentframe()
        ))[0]
))
于 2012-08-18T12:20:44.090 回答