如何打破Python中的链式方法?

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

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

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

你可以使用额外的括号:

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

在这种情况下,连续字符最好打开括号。 随着方法名称变长以及方法开始引用参数,对这种样式的需求变得更加明显:

 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() \ 

PEP 8打算用一种常识和一种实际和美丽的眼光来解释。 高兴地违反任何PEP 8指南,导致丑陋或难以阅读的代码。

这就是说,如果你经常发现自己与PEP 8不一致,这可能是一个标志,有可读性问题,超越你select的空白:-)

我个人的select是:

 subkeyword = Session.query(
     Subkeyword.subkeyword_id,
     Subkeyword.subkeyword_word,
 )。过滤(
     subkeyword_company_id = self.e_company_id,
     subkeyword_word = subkeyword_word,
     subkeyword_active =真,
 )。一()

只需存储中间结果/对象,并调用下一个方法,例如

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

根据Python语言参考
你可以使用反斜杠。
或者干脆打破它。 如果一个括号不配对,python不会把它当作一条线。 在这种情况下,以下几行的缩进并不重要。

这有点不同于其他人提供的解决scheme,但却是我的最爱,因为它有时导致了漂亮的元编程。

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

这是构buildsearch的好技术。 通过复杂的查询表单(或基于string的扣除关于用户的查找内容)的条件列表,然后将字典分解到filter中。

你似乎使用SQLAlchemy,如果它是真的, sqlalchemy.orm.query.Query.filter_by()方法需要多个关键字参数,所以你可以写如:

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

我喜欢用两个块缩进这个参数,并且用一个块来表示这个语句:

 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)