如何打破没有括号或运算符的python中的长行? [复制]

Posted

技术标签:

【中文标题】如何打破没有括号或运算符的python中的长行? [复制]【英文标题】:How to break long lines in python that have no brackets or operators? [duplicate] 【发布时间】:2017-02-25 21:14:41 【问题描述】:

这与我在此站点上发现的类似问题不同,因为相关代码在字符限制之前没有任何运算符或括号,可以轻松拆分。我在 python 中有几行长行,在 79 个字符之前没有运算符或括号。举个例子:

self.caller.parent.parent.parent.caller.parent.bar.ids.actionview.remove_widget(self.caller.parent.parent.parent.caller.parent.bar.ids.actionview.startbutton)

上面的行在括号前有 72 个字符,并且在一个类的函数定义中,因此每个嵌套级别有 4 个字符间距,括号前有 81 个字符。

处理这个问题的首选方法是什么?

【问题讨论】:

为什么这段代码需要访问self.caller.parent.parent.parent.caller.parent.bar.ids.actionview?这听起来像是一个可怕的程序结构。 @user2357112 是的,我希望找到另一种方法来做到这一点,但 kivy 环境的工作方式某些小部件(例如弹出窗口)将主程序窗口作为父窗口,而不是创建它们的对象,因此我还没有想出一种方法来从对这些分离对象的函数调用中处理小部件。当用户继续执行程序时,我需要动态创建和销毁小部件,这是迄今为止我提出的唯一解决方案。话虽如此,我显然是 OO 编程的新手,我确信有更好的方法。 . 仍然是运营商。而且你总是可以用括号括起来整个表达式。至于首选 - 那是固执己见,但是:a)不要编写这样的代码,或者 b)如果必须,将其分解为一些变量,与 cmets 发生什么。 【参考方案1】:

对于您的特定示例,我希望如果您首先解决“使此代码可读”的问题,那么适合 79 个字符会很自然。

也就是说,你可以添加括号:

(self.caller.parent.parent
 .parent.caller.parent.bar
 .ids.actionview.remove_widget(
    self.caller.parent.parent
    .parent.caller.parent
    .bar.ids.actionview.startbutton)
)

【讨论】:

感谢这个作品;至于可读性,我同意这确实不理想。不幸的是,我有深度嵌套的对象,并且我正在使用的 kivy 环境(据我所知)不允许您通过 id 访问对象,除非它们是在 .kv 文件中以静态方式定义的。我正在动态创建和销毁对象,因此必须直接在层次结构中处理它们。 不过,在我的脑海中,我什至看不出 malicious 库如何阻止您使用 mybar = self.caller.parent.parent.parent.caller.parent.bar 之类的东西,然后使用 mybar from在那里。 好点...我会这样做的。

以上是关于如何打破没有括号或运算符的python中的长行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Python 中将长行分成多行? [复制]

如何将一长行代码粘贴到vs code mac中的多行[重复]

将“Section”中的一长行记录拆分为两行或多行

如何防止 YAML 在没有新行的情况下转储长行

python中的[][](双方括号运算符)运算符是啥?

如何使用flex包装contenteditable div中的长行