Jak mogę przerwać tę długą linię w Pythonie?

Jak byś się zajął formatowaniem długiej linii, takiej jak ta? Chciałbym, aby było to nie więcej niż 80 znaków szerokości:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))
Czy to moja najlepsza opcja?
url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))
Author: Gattster, 2010-01-13

4 answers

To jakiś początek. Nie jest złą praktyką definiowanie dłuższych ciągów poza kodem, który ich używa. To sposób na oddzielenie danych od zachowania. Pierwszą opcją jest połączenie liter ciągów w sposób niejawny, czyniąc je sąsiadującymi ze sobą:

("This is the first line of my text, "
"which will be joined to a second.")

Lub z kontynuacjami końcowymi linii, które są trochę delikatniejsze, ponieważ to działa:

"This is the first line of my text, " \
"which will be joined to a second."

Ale to nie:

"This is the first line of my text, " \ 
"which will be joined to a second."
Widzisz różnicę? Nie? Cóż, nie będziesz, gdy to Twój kod ani jedno, ani drugie.

Minusem połączenia implicit jest to, że działa tylko z literałami ciągów, a nie z ciągami zaczerpniętymi z zmienne, Więc po refakturowaniu sprawy mogą być bardziej owłosione. Ponadto formatowanie można interpolować tylko na połączonym łańcuchu jako całości.

Alternatywnie, możesz dołączyć jawnie używając operatora konkatenacji(+):

("This is the first line of my text, " + 
"which will be joined to a second.")

Explicit jest lepszy niż implicit, jak mówi Zen Pythona, ale to tworzy trzy ciągi zamiast jednego i używa dwa razy więcej pamięci: są dwa, które napisałeś, plus jeden, który jest dwojgiem z nich połączonych, więc musisz wiedzieć, kiedy ignorować Zen. Plusem jest to, że można zastosować formatowanie do każdy z podciągów osobno w każdej linii lub do całej partii spoza nawiasów.

Wreszcie, możesz użyć potrójnie cytowanych ciągów:

"""This is the first line of my text
which will be joined to a second."""

Jest to często mój ulubiony, choć jego zachowanie jest nieco inne, jak znak nowego wiersza i wszystkie wiodące białe znaki w kolejnych wierszach pojawi się w twoim ostatnim sznurku. Nowy wiersz można wyeliminować za pomocą odwrotnego ukośnika.

"""This is the first line of my text \
which will be joined to a second."""

Ma to ten sam problem, co ta sama technika powyżej, w tym poprawnym kodzie różni się tylko od nieprawidłowego kodu niewidocznymi białymi spacjami.

Który z nich jest "najlepszy" zależy od konkretnej sytuacji, ale odpowiedź nie jest po prostu estetyczna, ale jedno z subtelnie różnych zachowań.

 248
Author: jcdyer,
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
2010-01-13 17:59:25

Kolejne literały ciągu są połączone przez kompilator, a wyrażenia w nawiasie są uważane za pojedynczą linię kodu:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))
 30
Author: Ignacio Vazquez-Abrams,
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
2010-01-13 17:43:47

Osobiście nie lubię wiszących otwartych klocków, więc sformatowałbym to jako:

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

Ogólnie nie zawracałbym sobie głowy zbyt trudną walką, aby Kod pasował dokładnie do 80-Kolumnowej linii. Warto ograniczyć długość linii do rozsądnych poziomów, ale limit hard 80 należy do przeszłości.

 8
Author: bobince,
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
2010-01-13 17:58:10

Możesz użyć modułu texttwrap, aby podzielić go na kilka linii

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

Z dokumentacji :

Textwrap.wrap (tekst [, szerokość [,...]])
Zawija pojedynczy akapit w tekst (ciąg znaków), więc każda linia ma długość znaków o największej szerokości. Zwraca listę linii wyjściowych bez końcowych znaków nowego wiersza.

Opcjonalne argumenty słów kluczowych odpowiadają atrybutom instancji TextWrapper, udokumentowane poniżej. szerokość domyślna to 70.

Zobacz TextWrapper.wrap() metoda dla dodatkowych szczegółów na temat zachowania wrap ().

 3
Author: Saurabh,
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
2018-07-23 17:20:56