如何在Python中断开一行链式方法?

如何在Python中断开一行链式方法?,python,coding-style,pep8,Python,Coding Style,Pep8,我有一行代码(不要怪命名约定,它们不是我的): 我不喜欢它的样子(不太可读),但在这种情况下,我没有更好的主意将行限制为79个字符。有没有更好的方法来打破它(最好没有反斜杠)?只需存储中间结果/对象并调用其上的下一个方法, e、 g 可以使用其他括号: subkeyword = ( Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) .filter_by(subkeyword_co

我有一行代码(不要怪命名约定,它们不是我的):


我不喜欢它的样子(不太可读),但在这种情况下,我没有更好的主意将行限制为79个字符。有没有更好的方法来打破它(最好没有反斜杠)?

只需存储中间结果/对象并调用其上的下一个方法, e、 g


可以使用其他括号:

subkeyword = (
        Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
        .filter_by(subkeyword_company_id=self.e_company_id)
        .filter_by(subkeyword_word=subkeyword_word)
        .filter_by(subkeyword_active=True)
        .one()
    )
根据
您可以使用反斜杠。

或者干脆打破它。如果括号未配对,python将不会将其视为一行。在这种情况下,下面几行的缩进并不重要。

您似乎在使用SQLAlchemy,如果它是真的,则该方法将使用多个关键字参数,因此您可以这样编写:

subkeyword = Session.query(Subkeyword.subkeyword_id,
                           Subkeyword.subkeyword_word) \
                    .filter_by(subkeyword_company_id=self.e_company_id,
                               subkeyword_word=subkeyword_word,
                               subkeyword_active=True) \
                    .one()
但最好是:

subkeyword = Session.query(Subkeyword.subkeyword_id,
                           Subkeyword.subkeyword_word)
subkeyword = subkeyword.filter_by(subkeyword_company_id=self.e_company_id,
                                  subkeyword_word=subkeyword_word,
                                  subkeyword_active=True)
subkeuword = subkeyword.one()

我个人的选择是:

subkeyword = Session.query( Subkeyword.subkeyword_id, Subkeyword.subkeyword_word, ).filter_by( subkeyword_company_id=self.e_company_id, subkeyword_word=subkeyword_word, subkeyword_active=True, ).one() subkeyword=Session.query( Subkeyword.Subkeyword\u id, Subkeyword.Subkeyword\u单词, ).过滤( 子关键字_company_id=self.e_company_id, subkeyword=subkeyword, 子关键字_active=True, ).1()
这种情况下,行连续字符优先于开括号。随着方法名称变得越来越长,以及方法开始使用参数,对这种样式的需求变得越来越明显:

subkeyword = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) \
                    .filter_by(subkeyword_company_id=self.e_company_id)          \
                    .filter_by(subkeyword_word=subkeyword_word)                  \
                    .filter_by(subkeyword_active=True)                           \
                    .one()
《政治公众人物》第8章旨在用常识和实用与美观的眼光来解读。很高兴违反了任何导致代码难看或难以阅读的PEP8准则


也就是说,如果您经常发现自己与PEP 8不一致,这可能是一个迹象,表明存在超越您选择的空白的可读性问题:-)

这是一个与其他人提供的解决方案不同的解决方案,但却是我的最爱,因为它有时会导致漂亮的元编程

base = [Subkeyword.subkeyword_id, Subkeyword_word]
search = {
    'subkeyword_company_id':self.e_company_id,
    'subkeyword_word':subkeyword_word,
    'subkeyword_active':True,
    }
subkeyword = Session.query(*base).filter_by(**search).one()

这是一种很好的构建搜索的技术。浏览要从复杂查询表单中挖掘的条件列表(或基于字符串的关于用户正在查找的内容的推断),然后将字典分解到过滤器中。

我喜欢将参数缩进两个块,将语句缩进一个块,如下所示:

for image_pathname in image_directory.iterdir():
    image = cv2.imread(str(image_pathname))
    input_image = np.resize(
            image, (height, width, 3)
        ).transpose((2,0,1)).reshape(1, 3, height, width)
    net.forward_all(data=input_image)
    segmentation_index = net.blobs[
            'argmax'
        ].data.squeeze().transpose(1,2,0).astype(np.uint8)
    segmentation = np.empty(segmentation_index.shape, dtype=np.uint8)
    cv2.LUT(segmentation_index, label_colours, segmentation)
    prediction_pathname = prediction_directory / image_pathname.name
    cv2.imwrite(str(prediction_pathname), segmentation)

我也最喜欢它。没有添加更多的代码,也没有反斜杠。不确定是什么原因导致了这里的额外缩进;我认为这个解决方案读起来和悬挂线缩进一次一样好,而尾随部分则完全不一样。在我看来,双缩进在这里很有用,因为它在视觉上不同于普通的缩进块。当被其他代码包围时,这使得它更明显地是一个包装的单行。最好的答案是使用parens。正如Shanimal在另一个答案中的评论所提到的,通过括号使用隐含的行延续实际上是对延续字符“我更喜欢反斜杠”。括号并不是对所有情况的提示。例如,它不适用于赋值运算符。假设您想在这个链中断开几行:
foo.set_default('bar',{})。set_default('spam',{})。set_default('eggs',{})['lol']='yeah'
+1 for SQLAlchemy filter_by()提示。这个例子很好,但我经常使用filter(),它只接受反斜杠上的1个条件+1,并在这种特殊情况下对齐链式过滤器。这种情况也出现在Django中,并且以这种方式可读性最好——但在任何其他情况下,我觉得括号中的短语都更为优越(不要遇到“我的反斜杠后面有空格吗?”的问题)。这就是说,括号中的短语可以用来实现同样的效果——但是它在阅读Python的过程中使你处于Lisp阅读模式,我发现它很震撼。我看不出这个解决方案如何更好地应对“方法名称变得更长,并且方法开始采取论据”,而不是“外包装”。“每次打开paren后和每次关闭paren前的换行”解决方案。事实上,它在处理这一点上更糟糕,因为(至少如图所示)它要求每个挂线都有更深的缩进。过滤器调用的缩进太多了。这里一个制表符或4个空格就足够了。还有对齐“`……你按住空格键多少秒了?通常我反对所有方式,这要求你像没有明天一样敲打空格键。fwiw,PEP8读”包装长行的首选方法是在括号、方括号和大括号内使用Python的隐含行继续。通过将表达式括在括号中,可以在多行上打断长行。应该优先使用这些选项,而不是使用反斜杠作为行延续。“-接着讨论了反斜杠何时合适——这是PEP8的重要参考!在对齐所有
.filter
调用时,一个恼人的问题是,如果您将
子关键字
更改为
子关键字
,那么您现在必须修复每一行的缩进,因为您更改了变量名。如果样式实际上妨碍了可维护性,则不太好……我同意如果传入多个参数,但如果0或1个参数是常见的,则看起来很难看。例如:是的,这种样式有退化的情况(像任何样式一样)。我不会破坏所有的开放性。所有这些都没有让我感到高兴,但这里有一些例子:这对查询之类的东西很有效,但作为一种通用模式,我不太确定。例如,在美丽的汤中链接时,如
team\u members=Soup.find(class='section team').find\u all('ul').find\u all('li')
,每个
.find(…)
调用的返回值都不符合
team\u members
的含义。@TaylorEdmiston当然,部分结果可以有不同的名称。类似于
section=soup.find(class='section-team')
team\u-members=section.find\u-all('ul')。find\u-all('li')
base = [Subkeyword.subkeyword_id, Subkeyword_word]
search = {
    'subkeyword_company_id':self.e_company_id,
    'subkeyword_word':subkeyword_word,
    'subkeyword_active':True,
    }
subkeyword = Session.query(*base).filter_by(**search).one()
for image_pathname in image_directory.iterdir():
    image = cv2.imread(str(image_pathname))
    input_image = np.resize(
            image, (height, width, 3)
        ).transpose((2,0,1)).reshape(1, 3, height, width)
    net.forward_all(data=input_image)
    segmentation_index = net.blobs[
            'argmax'
        ].data.squeeze().transpose(1,2,0).astype(np.uint8)
    segmentation = np.empty(segmentation_index.shape, dtype=np.uint8)
    cv2.LUT(segmentation_index, label_colours, segmentation)
    prediction_pathname = prediction_directory / image_pathname.name
    cv2.imwrite(str(prediction_pathname), segmentation)