Open7

python

Futa AraiFuta Arai

三項演算子的な書き方

# 他の言語にもあるシンプルなパターン
'odd' if x % 2 else 'even'

# 複数の条件を一行で
'positive' if x > 0 else 'negative' if x < 0 else 'zero'
Futa AraiFuta Arai

rstrip
指定された末尾の文字を除去する。指定しない場合は空白が除去される。

"   123   ".rstrip()
# "   123"

"///123///".rstrip("/")
# "///123"
Futa AraiFuta Arai

既存のリストからフィルタリングして新たなリストを作成 (1行で)

[n for n in numbers if n % 2 == 0]
Futa AraiFuta Arai

main 関数の実行

python script.py

のように直接実行される場合、__name__ という変数に __main__ という値が代入される。スクリプトが module として import される場合、__name__ はそのスクリプトの名前になる。
以下のような書き方を良くする。

def main():
    print("Hello, World!")

if __name__ == "__main__":
    main()
Futa AraiFuta Arai

relative import

https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time

python の relative import は実際のディレクトリ構造を読み取っているわけではなく、__name__ を元に行っている。
例えば

project/
    ├── __init__.py
    ├── scripts/
    │     ├── __init__.py
    │     └── sample_script.py
    └── util/
         ├── __init__.py
         └── logger.py

というディレクトリ構造で

# sample_script.py
from ..util.logger import Logger

みたいな import があった場合、python project/scripts/sample_script.py みたいな実行の仕方だと、__name__ の値が __main__ になるため、名前から相対情報が読み取れない。そのため、relative import が失敗する。

しかし、sample_script.py がモジュールである場合は、__name__scripts.sample_script となるため、..util.loggerutil.logger と変換され、正常に import される。