Z czegoś takiego:
print(get_indentation_level())
print(get_indentation_level())
print(get_indentation_level())
Chciałbym dostać coś takiego:
1
2
3
Czy kod może się w ten sposób odczytać?
Chcę tylko, aby dane wyjściowe z bardziej zagnieżdżonych części kodu były bardziej zagnieżdżone. W ten sam sposób, w jaki ułatwia to odczytanie kodu, ułatwiłoby to odczytanie danych wyjściowych.
Oczywiście mogę zaimplementować to ręcznie, za pomocą np .format()
, ale to, co miał na myśli, był zwyczaj Funkcja drukowania co print(i*' ' + string)
gdzie i
jest poziom wcięcia. Byłby to szybki sposób na uzyskanie czytelnego wyniku na moim terminalu.
Czy istnieje lepszy sposób na to, aby uniknąć żmudnego ręcznego formatowania?
python
reflection
metaprogramming
indentation
tokenize
Fab von Bellingshausen
źródło
źródło
get_indentation_level()
instrukcję w swoim kodzie. Możesz równie dobrze zrobićprint(3)
lub cokolwiek bezpośrednio. Bardziej interesujący może być obecny poziom zagnieżdżenia na stosie wywołań funkcji.depth
parametru i dodanie do niego odpowiedniej wartości w razie potrzeby, gdy przekazujesz go do innych funkcji. Zagnieżdżenie kodu prawdopodobnie nie będzie dokładnie odpowiadać wcięciom, które chcesz w wyniku.Odpowiedzi:
Jeśli chcesz wcięcia pod względem poziomu zagnieżdżenia, a nie spacji i tabulatorów, sprawy stają się trudne. Na przykład w poniższym kodzie:
wywołanie
get_nesting_level
jest faktycznie zagnieżdżone o jeden poziom w głąb, pomimo faktu, że w wierszuget_nesting_level
wywołania nie ma wiodących białych znaków . Tymczasem w poniższym kodzie:wywołanie
get_nesting_level
jest zagnieżdżone w głębi zera, pomimo obecności wiodących białych znaków w jego linii.W poniższym kodzie:
te dwa wywołania
get_nesting_level
znajdują się na różnych poziomach zagnieżdżenia, mimo że wiodące białe znaki są identyczne.W poniższym kodzie:
czy to zagnieżdżone poziomy zerowe czy jeden? Jeśli chodzi o
INDENT
iDEDENT
tokeny w gramatyce formalnej, jest to poziom zerowy, ale możesz nie czuć tego samego.Jeśli chcesz to zrobić, będziesz musiał tokenizować cały plik do momentu wywołania, liczenia
INDENT
iDEDENT
tokenów.tokenize
Moduł byłby bardzo przydatny dla takiej funkcji:źródło
get_nesting_level()
jest wywoływana w ramach tego wywołania funkcji - zwraca poziom zagnieżdżenia w ramach tej funkcji. Czy można go przepisać, aby przywrócić „globalny” poziom zagnieżdżenia?while
iwith
, byłoby to wykonalne, ale nie o to prosiłeś i zmieniając pytanie, aby zadać coś innego w tym momencie byłby złym pomysłem.linecache
moduł do takich rzeczy - jest używany do drukowanialinecache
może przydać się do zmniejszenia ilości operacji we / wy pliku (i dziękuję za przypomnienie mi o tym), ale gdybym zaczął to optymalizować, przejmowałbym się tym, jak ponownie tokenizujemy ten sam plik w celu powtórzenia to samo połączenie lub wiele witryn z połączeniami w tym samym pliku. Jest wiele sposobów, w jakie moglibyśmy to zoptymalizować, ale nie jestem pewien, jak bardzo chcę dostroić i zabezpieczyć tę szaloną rzecz.Tak, to zdecydowanie możliwe, oto działający przykład:
źródło
print('{Space}'*get_indentation_level(), x)
Możesz użyć
sys.current_frame.f_lineno
, aby uzyskać numer linii. Następnie, aby znaleźć liczbę poziomów wcięć, musisz znaleźć poprzednią linię z zerowym wcięciem, a następnie odejmując bieżący numer linii od numeru tej linii, otrzymasz liczbę wcięć:Próbny:
Jeśli chcesz, aby numer poziomu wcięcia był oparty na poprzednich wierszach
:
, możesz to zrobić z niewielką zmianą:Próbny:
Alternatywną odpowiedzią jest tutaj funkcja obliczania liczby wcięć (białych znaków):
źródło
:
dopóki nie napotkamy linii z zerowym wcięciem, sprawdź edycję!{3:4, \n 2:get_ind_num()}
Aby rozwiązać „prawdziwy” problem, który doprowadził do twojego pytania, możesz zaimplementować menedżera kontekstu, który śledzi poziom
with
wcięć i sprawi, że struktura blokowa w kodzie będzie odpowiadać poziomom wcięć wyjścia. W ten sposób wcięcie kodu nadal odzwierciedla wcięcie wyjścia bez zbytniego łączenia obu. Nadal istnieje możliwość refaktoryzacji kodu na różne funkcje i inne wcięcia oparte na strukturze kodu, które nie zakłócają wcięcia wyjścia.Wynik:
źródło
źródło