Jakie jest właściwe wcięcie multilinii w Pythonie w obrębie funkcji?
def method():
string = """line one
line two
line three"""
lub
def method():
string = """line one
line two
line three"""
albo coś innego?
To dziwne, że ciąg wisi na zewnątrz funkcji w pierwszym przykładzie.
method.__doc__
nie jest modyfikowany przez sam Python bardziej niż jakikolwiek innystr
literał.Odpowiedzi:
Prawdopodobnie chcesz się połączyć z
"""
Ponieważ znaki nowego wiersza i spacje są zawarte w samym ciągu, należy go przetworzyć później. Jeśli nie chcesz tego robić i masz dużo tekstu, możesz przechowywać go osobno w pliku tekstowym. Jeśli plik tekstowy nie działa dobrze w twojej aplikacji i nie chcesz postprocesować, prawdopodobnie bym poszedł
Jeśli chcesz przetworzyć łańcuch wielowierszowy w celu wycięcia niepotrzebnych części, powinieneś rozważyć
textwrap
moduł lub technikę przetwarzania dokumentów w postprocessingu przedstawioną w PEP 257 :źródło
trim()
Funkcja, jak określono w PEP257 jest zaimplementowana w bibliotece standardowej jakinspect.cleandoc
.string
natext
lub cokolwiek o innej długości, musisz teraz zaktualizować wcięcie dosłownie każdej linii łańcuch wielowierszowy , aby dopasować go do"""
właściwego. Strategia wcięć nie powinna komplikować przyszłych refaktorów / konserwacji i jest to jedno z miejsc, w których PEP naprawdę zawodzitextwrap.dedent
Funkcja pozwala zacząć od prawidłowego wcięcia w źródle , a następnie rozebrać go z tekstu przed użyciem.Kompromis, jak zauważają niektórzy inni, polega na tym, że jest to dodatkowe wywołanie funkcji dosłowne; weź to pod uwagę przy podejmowaniu decyzji, gdzie umieścić te literały w kodzie.
Końcowym
\
dosłownym komunikatem dziennika jest upewnienie się, że podział wiersza nie jest w tym dosłownym; w ten sposób dosłowność nie zaczyna się pustą linią, a zaczyna od następnej pełnej linii.Zwracana wartość z
textwrap.dedent
jest łańcuchem wejściowym ze wszystkimi typowymi wiodącymi wcięciami białych znaków usuniętymi w każdym wierszu łańcucha. Tak więc powyższalog_message
wartość będzie:źródło
textwrap.dedent()
wywołania jest stała wartość, podobnie jak argument wejściowy.def foo: return foo.x
następnie następny wierszfoo.x = textwrap.dedent("bar")
.Użyj
inspect.cleandoc
tak:Względne wcięcie zostanie zachowane zgodnie z oczekiwaniami. Jak skomentowano poniżej, jeśli chcesz zachować poprzedzające puste linie, użyj
textwrap.dedent
. Zachowuje to jednak także pierwszą linię podziału.źródło
inspect.cleandoc
istnieje od czasu Python 2.6 , który był w 2008 roku ..? Absolutnie najczystsza odpowiedź, szczególnie dlatego, że nie używa stylu wiszącego wcięcia, które po prostu marnuje niepotrzebną ilość miejscaJedną z opcji, która wydaje się brakować w innych odpowiedziach (wspomnianych tylko głęboko w komentarzu naxa), jest następująca:
Pozwoli to na prawidłowe wyrównanie, niejawne łączenie linii i nadal będzie zachowywać przesunięcie linii, co dla mnie jest jednym z powodów, dla których i tak chciałbym używać ciągów wielowierszowych.
Nie wymaga żadnego postprocessingu, ale musisz ręcznie dodać
\n
w dowolnym miejscu, w którym chcesz zakończyć linię. Albo inline, albo jako osobny ciąg po. Ten ostatni łatwiej jest skopiować i wkleić.źródło
Więcej opcji. W Ipython z włączoną funkcją pylab dedent jest już w przestrzeni nazw. Sprawdziłem i pochodzi z matplotlib. Lub można go zaimportować za pomocą:
W dokumentacji stwierdza się, że jest on szybszy niż ekwipunek do zawijania tekstu, aw moich testach w ipython jest on średnio 3 razy szybszy w moich szybkich testach. Ma także tę zaletę, że odrzuca wszelkie puste puste linie, co pozwala na elastyczność w tworzeniu łańcucha:
Użycie matplotlib dedent na tych trzech przykładach da ten sam rozsądny rezultat. Funkcja pochylania tekstu będzie miała wiodący pusty wiersz z pierwszym przykładem.
Oczywistą wadą jest to, że zawijanie tekstu znajduje się w standardowej bibliotece, podczas gdy matplotlib jest modułem zewnętrznym.
Niektóre kompromisy tutaj ... funkcje dedent sprawiają, że kod jest bardziej czytelny tam, gdzie definiowane są ciągi, ale wymagają przetworzenia później, aby uzyskać ciąg w użytecznym formacie. W dokumentach jest oczywiste, że należy używać poprawnego wcięcia, ponieważ większość zastosowań dokumentów będzie wymagała przetwarzania.
Kiedy potrzebuję długiego łańcucha w kodzie, znajduję następujący, co prawda brzydki kod, w którym pozwalam, by długi łańcuch wypadł z otaczającego wcięcia. Zdecydowanie zawodzi „Piękne jest lepsze niż brzydkie”, ale można argumentować, że jest prostsze i bardziej wyraźne niż wydana alternatywa.
źródło
Jeśli chcesz szybkiego i łatwego rozwiązania i oszczędzasz sobie pisania nowych linii, możesz zamiast tego wybrać listę, np .:
źródło
wolę
lub
źródło
Moje dwa centy, uniknij końca linii, aby uzyskać wcięcia:
źródło
Przybyłem tutaj, szukając prostej 1-liniowej linijki do usuwania / poprawiania poziomu identyfikacji dokumentów do drukowania, bez powodowania niechcianego wyglądu , na przykład poprzez „zawieszenie się poza funkcją” w skrypcie.
Oto co skończyłem:
Oczywiście, jeśli wcinasz spacje (np. 4) zamiast klawisza tab, użyj czegoś takiego:
I nie musisz usuwać pierwszego znaku, jeśli podoba Ci się twój ciąg dokumentów, aby wyglądał w ten sposób:
źródło
Pierwsza opcja jest dobra - z uwzględnieniem wcięcia. Jest w stylu python - zapewnia czytelność kodu.
Aby wyświetlić go poprawnie:
źródło
Zależy to od sposobu wyświetlania tekstu. Jeśli chcesz, aby wszystko było wyrównane do lewej, sformatuj go jak w pierwszym fragmencie lub przejdź przez linie przycinające w lewo całą przestrzeń.
źródło
W przypadku ciągów możesz zaraz po przetworzeniu ciągu. W przypadku dokumentów należy przetworzyć funkcję zamiast tego. Oto rozwiązanie dla obu, które jest nadal czytelne.
źródło
inspect.cleandoc
- które robią to we właściwy sposób.Mam podobny problem, kod stał się naprawdę nieczytelny przy użyciu multilinii, wyszło mi coś takiego
tak, na początku może wyglądać okropnie, ale wbudowana składnia była dość złożona, a dodanie czegoś na końcu (np. „\ n” ”) nie było rozwiązaniem
źródło
Możesz użyć tej funkcji trim_indent .
Wynik:
źródło