如何在 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个字符以内。有没有更好的破解方法(最好不要用反斜杠) ?

49449 次浏览

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

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

你可以加上括号:

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 语言参考
你可以用反斜杠。
或者直接打破它。如果没有配对括号,python 将不会将其视为一行。在这种情况下,下列行的缩进并不重要。

你似乎在使用 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()

我个人的选择是:

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) \
.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不一致,这可能是一个信号,表明存在可读性问题,这些问题超出了您选择空格的范围: -)

这种解决方案与其他解决方案略有不同,但却是我的最爱,因为它有时会导致漂亮的元编程。

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)

最佳答案的一个小变化: 主对象(Session)保留在顶行中,并使用单个缩进。这样可以快速识别主对象和所有后续的链式方法调用。.

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