INI-files parser with schemes and types
Application settings must be simple! In it should be a code or complex structures. Must be only a simple types.
JSON?
JSON is uncomfortable and unextendable.
YAML?
The YAML is like a garden of rakes. It's very complex format. I do not need all it's features.
- Configparser is ugly;
- Configparser is overengineered;
- Configparser does not have type casting;
- Configparser does not have type checking;
- Configparser is... configparser.
- boolean
simple
true
orfalse
, e.g.key = true
- int
simple numeric type, e.g.
key = 13
- float
float type, e.g.
key = 3.14
- string
strings always uses quotes, e.g.
key = "some string"
- datetime
datetime formated as ISO 8601
YYYY-MM-DD
YYYY-MM-DD hh:mm
YYYY-MM-DD hh:mm:ss
YYYY-MM-DD hh:mm:ss.sss
When specifying the time, you can set timezone as
Z
or±hh:mm
.E.g.:
key = 2005-01-13
key = 2005-01-13 18:05:00
key = 2005-01-13 15:05:00 +03:00
key = 2005-01-13 15:00Z
- timedelta
durations:
key = 20m
— 20 minuteskey = 10h2m
— 10 hours and 2 minuteskey = 1w2s
— one week (7 days) and 2 secondskey = 1s20ms
— one 2 second and 20 millisecondskey = 1w1d1h1m1s1ms
— 694861001 milliseconds
- list
list of values:
key = "string value" 2005-01-13 18:00:05 13
$ cat tests/test.ini
# first comment
[first]
boolean = false
integer = 13
[second]
; second comment
boolean = true
string = "some string"
[complex]
list =
"string"
"string too"
"else string"
>>> from zini import Zini
>>> ini = Zini()
>>> result = ini.read('tests/test.ini')
>>> isinstance(result, dict)
True
>>> result['first']['boolean'] is False # automatic type casting
True
>>> result['first']['integer'] == 13
True
>>> result['second']['string'] == "some string"
True
>>> result['complex']['list'] == ["string", "string too", "else string"]
True
>>> from zini import Zini
>>> ini = Zini()
>>> ini['first']['integer'] = str # set type
>>> result = ini.read('tests/test.ini')
zini.ParseError: error in line 3: 'integer = 13'
>>> from zini import Zini
>>> ini = Zini()
>>> ini['second']['boolean'] = "string" # set type and default value
>>> result = ini.read('tests/test.ini')
zini.ParseError: error in line 7: 'boolean = true'
>>> import zini
>>> ini = zini.Zini()
>>> ini['third']['generic'] = [str]
>>> result = ini.read('tests/test.ini')
ParseError: error in line 20: ' 10'