Mam bardzo długie zapytanie. Chciałbym podzielić go na kilka wierszy w Pythonie. Sposobem na zrobienie tego w JavaScript byłoby użycie kilku zdań i połączenie ich z +
operatorem (wiem, może nie jest to najskuteczniejszy sposób, ale nie martwię się o wydajność na tym etapie, tylko o czytelność kodu) . Przykład:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Próbowałem zrobić coś podobnego w Pythonie, ale to nie zadziałało, więc \
dzieliłem długi ciąg. Nie jestem jednak pewien, czy jest to jedyny / najlepszy / pythoniczny sposób na zrobienie tego. Wygląda niezręcznie. Rzeczywisty kod:
query = 'SELECT action.descr as "action", '\
'role.id as role_id,'\
'role.descr as role'\
'FROM '\
'public.role_action_def,'\
'public.role,'\
'public.record_def, '\
'public.action'\
'WHERE role.id = role_action_def.role_id AND'\
'record_def.id = role_action_def.def_id AND'\
'action.id = role_action_def.action_id AND'\
'role_action_def.account_id = ' + account_id + ' AND'\
'record_def.account_id=' + account_id + ' AND'\
'def_id=' + def_id
python
string
multiline
multilinestring
Pablo Mescher
źródło
źródło
Odpowiedzi:
Czy mówisz o ciągach wieloliniowych? Łatwe, użyj potrójnych cytatów, aby je rozpocząć i zakończyć.
Możesz także używać pojedynczych cudzysłowów (3 z nich oczywiście na początku i na końcu) i traktować wynikowy ciąg znaków
s
tak jak każdy inny ciąg.UWAGA : Podobnie jak w przypadku dowolnego łańcucha, cokolwiek między początkowymi i końcowymi cudzysłowami staje się częścią łańcucha, tak więc w tym przykładzie znajduje się wiodąca spacja (jak wskazał @ root45). Ten ciąg będzie zawierał zarówno puste, jak i nowe wiersze.
To znaczy,:
Wreszcie, w Pythonie można również budować długie linie:
który nie będzie zawierał żadnych dodatkowych spacji ani znaków nowej linii (jest to celowy przykład pokazujący, jaki będzie efekt pominięcia spacji):
Nie wymaga przecinków, po prostu umieść ciągi, które mają zostać połączone, w nawiasie i upewnij się, że uwzględnisz wszelkie potrzebne spacje i znaki nowej linii.
źródło
+
operatora nie powoduje konkatenacji w czasie wykonywania?textwrap.dedent
do usunięcia niechcianych wiodących białych znaków. docs.python.org/3/library/textwrap.html#textwrap.dedentJeśli nie chcesz ciągu wielowierszowego, ale po prostu masz długi ciąg jednego wiersza, możesz użyć nawiasów, po prostu upewnij się, że nie zawierasz przecinków między segmentami ciągów, to będzie krotka.
W instrukcji SQL, takiej jak to, co konstruujesz, łańcuchy wielowierszowe byłyby również w porządku. Ale jeśli dodatkowa spacja, którą miałby ciąg wielowierszowy, stanowiłaby problem, byłby to dobry sposób na osiągnięcie tego, co chcesz.
źródło
,
'
?.format(...)
po nawiasie zamykającym.%
notacja formująca też musi działać, ale jeszcze tego nie próbowałem' foo '+variable
nie będzie działać, ale' foo '+variable+''
będzie.Przełamywanie linii
\
działa dla mnie. Oto przykład:źródło
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
kiedy pisałem w środkuprint()
Byłem zadowolony z tego:
źródło
.replace('\t','')
Uważam, że budując długie ciągi, zwykle robisz coś takiego jak budowanie zapytania SQL, w którym to przypadku najlepiej:
To, co sugerował Levon, jest dobre, ale może być podatne na błędy:
źródło
Możesz także łączyć zmienne, używając notacji „”:
EDYCJA: Znaleziono lepszy sposób, z nazwanymi parametrami i .format ():
źródło
Podejście to wykorzystuje:
tylko jeden odwrotny ukośnik, aby uniknąć początkowego wysuwu wierszatextwrapinspect
account_id
idef_id
.W ten sposób wygląda mi najbardziej pytonicznie.
Aktualizacja : 29.01.2019 Włącz sugestię @ ShadowRanger
inspect.cleandoc
zamiasttextwrap.dedent
źródło
inspect.cleandoc
jest nieco ładniejszy niżtextwrap.dedent
, ponieważ nie wymaga, aby pierwsza linia była pusta ze znakiem kontynuacji linii na końcu.inspect.cleandoc
do tego wykorzystywać .W Pythonie> = 3.6 możesz użyć sformatowanych literałów łańcuchowych (ciąg f)
źródło
Na przykład:
jeśli wartość warunku powinna być łańcuchem, możesz to zrobić w następujący sposób:
źródło
Uważam,
textwrap.dedent
że najlepsze dla długich ciągów, jak opisano tutaj :źródło
Inni wspominali już o metodzie nawiasów, ale chciałbym dodać, że w nawiasach dozwolone są wstawiane komentarze.
Komentarz do każdego fragmentu:
Komentarz nie jest dozwolony po kontynuacji:
Podczas korzystania z kontynuacji linii z odwrotnym ukośnikiem (
\
) komentarze nie są dozwolone. OtrzymaszSyntaxError: unexpected character after line continuation character
błąd.Lepsze komentarze do ciągów Regex:
Na podstawie przykładu z https://docs.python.org/3/library/re.html#re.VERBOSE ,
źródło
Osobiście uważam, że to najlepszy (prosty, bezpieczny i Python) sposób pisania surowych zapytań SQL w Pythonie, szczególnie gdy używa się modułu sqlite3 Pythona :
Plusy
Cons
?
symbol zastępczy, śledzenie,?
która zmienna Pythona ma być zastąpiona przez zmienną Python , może być nieco trudne .źródło
cursor.execute(query.format(vars))
. To powinno zająć się twoim jedynym „oszustwem” (mam nadzieję).format
byłoby przyjemne, ale nie jestem pewien, czy sformatowany w ten sposób ciąg zapytania byłby bezpieczny przed wstrzyknięciem SQL.cursor.execute(query.format(vars))
nie robisz, nie czerpiesz już korzyści z przygotowanych instrukcji, więc jesteś podatny na różnego rodzaju problemy, zaczynając od faktu, że jeśli parametry nie są tylko liczbami, musisz je podwójnie zacytować w zapytaniu SQL.Zwykle używam czegoś takiego:
Jeśli chcesz usunąć irytujące puste miejsca w każdej linii, możesz wykonać następujące czynności:
źródło
textwrap.dedent
funkcji Pythona , która znajduje się w standardowej bibliotece, ma ona potrzebną funkcjonalność.inspect.cleandoc
jest nieco ładniejszy (mniej wybredny, czy tekst pojawia się w tym samym wierszu co otwarte cudzysłowy, nie wymaga wyraźnych znaków kontynuacji linii).Rzeczywisty kod nie powinien działać, brakuje białych znaków na końcu „wierszy” (np .:
role.descr as roleFROM...
:)Istnieją potrójne cytaty dla ciągu wielowierszowego:
Będzie zawierać podział wiersza i dodatkowe spacje, ale w przypadku SQL nie stanowi to problemu.
źródło
Możesz także umieścić instrukcję sql w osobnym pliku
action.sql
i załadować ją do pliku py za pomocąTak więc instrukcje sql zostaną oddzielone od kodu python. Jeśli w instrukcji sql znajdują się parametry, które należy wypełnić z python, możesz użyć formatowania ciągów (np.% S lub {field})
źródło
Scala „À la” (ale myślę, że jest to najbardziej pythoniczny sposób, jak wymaga OQ):
Jeśli chcesz końcowy ciąg bez linii przeskoku, po prostu umieść
\n
na początku pierwszego argumentu drugiego zastępowania:Uwaga: biała linia między „... szablonami”. i „Ponadto…” wymaga spacji po
|
.źródło
tl; dr: Użyj
"""\
i,"""
aby zawinąć ciąg , jak wZ oficjalnej dokumentacji Pythona :
źródło
Hej, spróbuj czegoś takiego, mam nadzieję, że to zadziała, jak w tym formacie zwróci ci ciągłą linię, jakbyś pomyślnie zapytał o tę właściwość`
źródło
Używam funkcji rekurencyjnej do budowania złożonych zapytań SQL. Tę technikę można ogólnie zastosować do budowy dużych ciągów przy zachowaniu czytelności kodu.
PS: Zajrzyj do niesamowitej biblioteki python-sqlparse, aby w razie potrzeby całkiem wydrukować zapytania SQL. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
źródło
Inna opcja, która moim zdaniem jest bardziej czytelna, gdy kod (np. Zmienna) jest wcięty, a ciąg wyjściowy powinien być jednowarstwowy (bez znaków nowej linii):
źródło
Użyj potrójnych cudzysłowów. Ludzie często używają ich do tworzenia dokumentów na początku programów w celu wyjaśnienia ich celu i innych informacji związanych z jego tworzeniem. Ludzie używają ich również w funkcjach, aby wyjaśnić cel i zastosowanie funkcji. Przykład:
źródło
Podoba mi się to podejście, ponieważ uprzywilejowuje czytanie. W przypadkach, gdy mamy długie sznurki, nie ma mowy! W zależności od poziomu wcięcia, w którym się znajdujesz i nadal jesteś ograniczony do 80 znaków w wierszu ... Cóż ... Nie musisz nic więcej mówić. Moim zdaniem przewodniki w stylu python są nadal bardzo niejasne. Przyjąłem podejście @Eero Aaltonen, ponieważ uprzywilejowuje czytanie i zdrowy rozsądek. Rozumiem, że przewodniki po stylu powinny nam pomóc, a nie popsuć nasze życie. Dzięki!
źródło
Z oficjalnej dokumentacji Pythona :
źródło
Aby zdefiniować długi ciąg znaków wewnątrz dykta, zachowując znaki nowej linii, ale pomijając spacje , ostatecznie zdefiniowałem ciąg znaków w następujący sposób:
źródło
Jako ogólne podejście do długich ciągów znaków w Pythonie możesz użyć potrójnych cudzysłowów
split
ijoin
:Wynik:
W odniesieniu do pytania OP dotyczącego zapytania SQL, odpowiedź poniżej pomija poprawność tego podejścia do budowania zapytań SQL i skupia się wyłącznie na budowaniu długich ciągów w czytelny i estetyczny sposób bez dodatkowych importów. Pomija również obciążenie obliczeniowe z tym związane.
Za pomocą potrójnych cudzysłowów budujemy długi i czytelny ciąg, który następnie dzielimy na listę,
split()
usuwając w ten sposób białe znaki, a następnie łącząc je z powrotem' '.join()
. Na koniec wstawiamy zmienne za pomocąformat()
polecenia:Produkuje:
Edycja: To podejście nie jest zgodne z PEP8, ale czasami uważam je za przydatne
źródło
Ogólnie używam
list
ijoin
do wieloliniowych komentarzy / napisów.możesz użyć dowolnego łańcucha, aby połączyć wszystkie elementy listy, takie jak „
\n
(nowa linia) lub,
” (przecinek) lub „” (spacja)
Twoje zdrowie..!!
źródło