У меня есть строка следующего кода (не вините за соглашения об именах, они не мои):
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 символами в этой ситуации. Есть ли способ лучше его сломать (желательно без обратной косой черты)?
python
coding-style
pep8
Юлиуш Гонера
источник
источник
foo.set_default('bar', {}).set_default('spam', {}).set_default('eggs', {})['lol'] = 'yeah'
Это тот случай, когда символ продолжения строки предпочтительнее открывать круглые скобки. Потребность в этом стиле становится более очевидной по мере того, как имена методов становятся длиннее и когда методы начинают принимать аргументы:
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, это может быть признаком того, что есть проблемы с читабельностью, которые выходят за рамки вашего выбора пробелов :-)
источник
.filter
вызовов заключается в том, что если вы измените значениеsubkeyword
наsub_keyword
, теперь вам придется исправить отступ каждой отдельной строки только потому, что вы изменили имя переменной.Мой личный выбор:
источник
Просто сохраните промежуточный результат / объект и вызовите для него следующий метод, например
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()
источник
team_members = soup.find(class_='section team').find_all('ul').find_all('li')
возвращаемое значение от каждого.find(...)
вызова еще не соответствует значениюteam_members
.section = soup.find(class_='section team')
иteam_members = section.find_all('ul').find_all('li')
.Согласно справочнику по языку Python,
вы можете использовать обратную косую черту.
Или просто сломайте. Если скобка не спарена, python не будет рассматривать это как строку. И в таком случае отступ следующих строк не имеет значения.
источник
Это немного другое решение, чем другие, но мое любимое, поскольку оно иногда приводит к изящному метапрограммированию.
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()
Это хороший прием для построения поисковых запросов. Просмотрите список условных выражений для извлечения из вашей сложной формы запроса (или основанные на строках выводы о том, что ищет пользователь), а затем просто вставьте словарь в фильтр.
источник
Кажется, вы используете 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)
источник