Python configparserのget()とは?値を型付きで取り出す方法
get()とその仲間は、設定ファイルの値を型付きで取り出すメソッドです。
INIの値はすべて文字列なので、数値や真偽値として使うには変換が必要です。
値は必ず文字列
import configparser
c = configparser.ConfigParser()
c.read("config.ini")
port = c["server"]["port"]
print(repr(port), type(port).__name__)
実行結果:
'8080' str
8080と書いてあっても文字列の'8080'です。
これに気づかないと、port + 1でTypeErrorになったり、if debug:が常に真になったりします。
4つの取得メソッド
print(c.get("server", "host"))
print(c.getint("server", "port"))
print(c.getfloat("server", "timeout"))
print(c.getboolean("server", "debug"))
実行結果:
localhost
8080
30.0
True
| メソッド | 戻り値の型 |
|---|---|
get() |
str |
getint() |
int |
getfloat() |
float |
getboolean() |
bool |
引数は「セクション名, キー名」の2つです。角括弧で書くc["server"]["port"]と同じ場所を指します。
getbooleanが受け付ける値
for v in ["yes", "no", "true", "false", "on", "off", "1", "0"]:
c["t"] = {"v": v}
print(f"{v!r:8} -> {c.getboolean('t', 'v')}")
実行結果:
'yes' -> True
'no' -> False
'true' -> True
'false' -> False
'on' -> True
'off' -> False
'1' -> True
'0' -> False
大文字小文字は区別されません。YESもTrueも同じように扱われます。
一方で、それ以外の値はエラーになります。
c["t"] = {"v": "はい"}
c.getboolean("t", "v")
実行結果:
ValueError: Not a boolean: はい
なおbool("false")はTrueになります。空でない文字列はすべて真だからです。
bool()で変換してはいけません。必ずgetboolean()を使ってください。
無いときの例外
c.get("server", "zzz")
実行結果:
configparser.NoOptionError: No option 'zzz' in section: 'server'
c.get("zzz", "a")
実行結果:
configparser.NoSectionError: No section: 'zzz'
キーが無い場合とセクションが無い場合で例外が違います。どちらもKeyErrorではありません。
角括弧で書いた場合はKeyErrorになります。書き方によって例外が変わる点に注意してください。
fallbackで既定値を渡す
print(c.get("server", "zzz", fallback="既定値"))
print(c.getint("server", "retry", fallback=3))
実行結果:
既定値
3
設定が任意項目のときに便利です。tryで囲む必要がなくなります。
すべてのget系メソッドで使えます。
ただし必須の設定にfallbackを付けてはいけません。書き忘れに気づけなくなります。
DEFAULTからも取れてしまう
print(c.get("database", "timeout"))
実行結果:
30
[database]にtimeoutは書かれていませんが、[DEFAULT]から引き継がれています。
そのためfallbackが使われないことがあります。
print(c.get("database", "timeout", fallback="99"))
実行結果:
30
「DEFAULTに書いた覚えがない値が返る」と感じたら、[DEFAULT]セクションを確認してください。
存在を確認する
print("server" in c)
print(c.has_section("server"))
print(c.has_option("server", "host"))
print(list(c["server"]))
実行結果:
True
True
True
['host', 'port', 'debug', 'timeout']
最後の行にtimeoutが含まれています。これも[DEFAULT]からの継承です。
セクションに直接書かれたキーだけを見たい場合は、c["DEFAULT"]のキーを除外する必要があります。
get系のまとめ
- INIの値はすべて文字列
getint()・getfloat()・getboolean()で変換getboolean()はyes/no/on/off/1/0に対応bool()で変換してはいけない("false"も真になる)- 例外は
NoOptionErrorとNoSectionError - 任意項目には
fallback——必須項目には付けない [DEFAULT]の継承でfallbackが効かないことがある





