[解決済み] Pythonのコードの行は、そのインデント・ネストレベルを知ることができますか?
質問
このようなものから
print(get_indentation_level())
print(get_indentation_level())
print(get_indentation_level())
このようなものが欲しいのですが。
1
2
3
このように、コードは自分自身を読み取ることができるのでしょうか?
私が欲しいのは、コードのよりネストされた部分からの出力だけです。これによってコードが読みやすくなるのと同じように、出力も読みやすくなるはずです。
もちろん、これを手動で実装することも可能で、例えば
.format()
しかし、私が考えていたのは、カスタムプリント機能で
print(i*' ' + string)
ここで
i
はインデントレベルです。これは、私のターミナルで読みやすい出力を作る手っ取り早い方法でしょう。
手間のかかる手作業での書式設定を避ける、もっと良い方法はないでしょうか?
どのように解決するのですか?
スペースやタブではなく、ネストレベルでインデントを行いたい場合は、事態が厄介になります。たとえば、次のようなコードです。
if True:
print(
get_nesting_level())
への呼び出しは
get_nesting_level
の行に先頭の空白がないにもかかわらず、実際には一階層分ネストしています。
get_nesting_level
を呼び出します。一方、次のようなコードでは
print(1,
2,
get_nesting_level())
への呼び出しは
get_nesting_level
は、その行の先頭に空白があるにもかかわらず、0レベルの深さにネストされています。
次のようなコードで
if True:
if True:
print(get_nesting_level())
if True:
print(get_nesting_level())
への2つの呼び出しは
get_nesting_level
は、先頭の空白が同じであるにもかかわらず、異なるネストレベルにあります。
次のようなコードで
if True: print(get_nesting_level())
は、ネストされた0レベルなのか、1レベルなのか?という点では
INDENT
と
DEDENT
トークンを正式な文法に当てはめると、0レベルの深さですが、同じように感じないかもしれませんね。
これをやるなら、ファイル全体を呼び出しのところまでトークン化して、カウント
INDENT
と
DEDENT
トークンを使用します。は
tokenize
モジュールは、このような機能には非常に便利です。
import inspect
import tokenize
def get_nesting_level():
caller_frame = inspect.currentframe().f_back
filename, caller_lineno, _, _, _ = inspect.getframeinfo(caller_frame)
with open(filename) as f:
indentation_level = 0
for token_record in tokenize.generate_tokens(f.readline):
token_type, _, (token_lineno, _), _, _ = token_record
if token_lineno > caller_lineno:
break
elif token_type == tokenize.INDENT:
indentation_level += 1
elif token_type == tokenize.DEDENT:
indentation_level -= 1
return indentation_level
関連
-
PicgoのイメージベッドツールをPythonで実装する
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み] IndentationError: unindent はどの外側インデントレベルにも一致しません。
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] Pythonで改行(行継続)をするにはどうしたらいいですか?
-
[解決済み] リスト内包とラムダ+フィルタの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】ValueError: xとyは同じサイズでなければならない