Jak złamać linię metod łańcuchowych w Pythonie?

Mam wiersz poniższego kodu (nie wiń za konwencje nazewnictwa, nie są moje):

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

Nie podoba mi się, jak to wygląda (niezbyt czytelne), ale nie mam lepszego pomysłu na ograniczenie linii do 79 znaków w tej sytuacji. Czy jest lepszy sposób na złamanie go (najlepiej bez ukośników wstecznych)?

Author: Juliusz Gonera, 2011-01-22

8 answers

Możesz użyć dodatkowego nawiasu:

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()
    )
 197
Author: sth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 19:58:02

Jest to przypadek, w którym zamiast nawiasów otwartych preferowany jest znak kontynuacji linii. Potrzeba tego stylu staje się bardziej oczywista, gdy nazwy metod stają się dłuższe i gdy metody zaczynają przyjmować argumenty:

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 ma być interpretowany z miarą zdrowego rozsądku i okiem zarówno na to, co praktyczne, jak i piękne. Szczęśliwie naruszają wszelkie wytyczne PEP 8, które skutkują brzydkim lub trudnym do odczytania kodem.

To jest powiedziane, jeśli często znajdziesz się w sprzeczności z PEP 8, może to być znak, że istnieją problemy z czytelnością, które wykraczają poza twój wybór białych znaków: -)

 40
Author: Raymond Hettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-09 15:10:46

Mój osobisty wybór to:

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()
 11
Author: pkoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-22 18:26:12

Wystarczy zapisać pośredni wynik / obiekt i wywołać na nim następną metodę, np.

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()
 9
Author: Ivo van der Wijk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-22 16:19:48

Zgodnie z odniesienie do języka Python
Możesz użyć ukośnika.
Albo po prostu go złamać. Jeśli nawias nie jest sparowany, python nie będzie traktował tego jako linii. I w takich okolicznościach wcięcia następujących linii nie mają znaczenia.

 4
Author: Haozhun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-22 16:23:38

Jest to nieco inne rozwiązanie niż oferowane przez innych, ale moje ulubione, ponieważ czasami prowadzi do sprytnego metaprogramowania.

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

To fajna technika wyszukiwania budynków. Przejrzyj listę warunków, które chcesz wydobyć ze złożonego formularza zapytania( lub opartych na ciągach dedukcji na temat tego, czego szuka użytkownik), a następnie po prostu eksploduj słownik do filtra.

 4
Author: Árni St. Sigurðsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-02 14:21:25

Wydaje się, że używasz SQLAlchemy, jeśli to prawda, sqlalchemy.orm.query.Query.filter_by() metoda pobiera wiele argumentów słów kluczowych, więc można napisać w następujący sposób:

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

Ale byłoby lepiej:

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()
 1
Author: minhee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-22 16:30:56

Lubię wciąć argumenty o dwa bloki, a wypowiedź o jeden blok, jak te:

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)
 1
Author: acgtyrant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 07:40:24