configparser --- پارسر پرونده پیکربندی¶
کد منبع: Lib/configparser.py
این ماژول، کلاس ConfigParser را ارائه میدهد که یک زبان پیکربندی پایه را پیادهسازی میکند و ساختاری مشابه آنچه در پروندههای INI ویندوز مایکروسافت یافت میشود، دارد. شما میتوانید از آن برای نوشتن برنامههای پایتون استفاده کنید که کاربران نهایی بتوانند بهراحتی آنها را سفارشیسازی کنند.
توجه
این کتابخانه پیشوندهای نوع مقدار استفادهشده در نسخه گسترشیافته سینتکس INI در Windows Registry را تفسیر یا نوشتن نمیکند.
همچنین ملاحظه نمائید
- ماژول
tomllib TOML قالبی با مشخصات دقیق برای پروندههای پیکربندی برنامهها است. این قالب بهطور خاص بهعنوان نسخهای بهبودیافته از INI طراحی شده است.
- ماژول
shlex پشتیبانی از ایجاد زبانهای کوچک شبیه به پوستهی یونیکس که میتوان از آنها برای پروندههای پیکربندی برنامه نیز استفاده کرد.
- ماژول
json ماژول
jsonزیرمجموعهای از سینتکس JavaScript را پیادهسازی میکند که گاهی برای پیکربندی به کار میرود، اما از کامنت پشتیبانی نمیکند.
شروع سریع¶
بیایید یک پروندهی پیکربندی بسیار ساده را در نظر بگیریم که به این شکل است:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[forge.example]
User = hg
[topsecret.server.example]
Port = 50022
ForwardX11 = no
ساختار پروندههای INI در بخش زیر توضیح داده شده است. در اصل، پرونده از بخشهایی تشکیل شده است که هر یک شامل کلیدهایی دارای مقدار است. کلاسهای configparser میتوانند چنین پروندههایی را بخوانند و بنویسند. برای شروع، پرونده پیکربندی فوق را بهصورت برنامهای ایجاد میکنیم.
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = {'ServerAliveInterval': '45',
... 'Compression': 'yes',
... 'CompressionLevel': '9'}
>>> config['forge.example'] = {}
>>> config['forge.example']['User'] = 'hg'
>>> config['topsecret.server.example'] = {}
>>> topsecret = config['topsecret.server.example']
>>> topsecret['Port'] = '50022' # mutates the parser
>>> topsecret['ForwardX11'] = 'no' # same here
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
... config.write(configfile)
...
همانطور که میبینید، میتوانیم با یک پارسر پیکربندی بسیار شبیه به یک دیکشنری رفتار کنیم. تفاوتهایی وجود دارد، که در ادامه توضیح داده شدهاند، اما رفتار آن بسیار به آنچه از یک دیکشنری انتظار دارید نزدیک است.
اکنون که یک پرونده پیکربندی ایجاد و ذخیره کردهایم، آن را دوباره میخوانیم و دادههایی را که در خود نگه میدارد بررسی میکنیم.
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['forge.example', 'topsecret.server.example']
>>> 'forge.example' in config
True
>>> 'python.org' in config
False
>>> config['forge.example']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.example']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['forge.example']:
... print(key)
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['forge.example']['ForwardX11']
'yes'
همانطور که در بالا میبینیم، API کاملاً سرراست است. تنها نکتهی جادویی مربوط به بخش DEFAULT است که مقادیر پیشفرض را برای تمام بخشهای دیگر فراهم میکند [1]. همچنین توجه داشته باشید که کلیدهای موجود در بخشها به بزرگی و کوچکی حروف حساس نیستند و بهصورت حروف کوچک ذخیره میشوند [1].
میتوان چند پیکربندی را در یک ConfigParser خواند، که در آن آخرین پیکربندی اضافهشده بیشترین اولویت را دارد. کلیدهای متعارض از پیکربندی جدیدتر گرفته میشوند، در حالی که کلیدهای از پیش موجود حفظ میشوند. مثال زیر پرونده override.ini را میخواند که کلیدهای متعارض موجود در پرونده example.ini را بازنویسی میکند.
[DEFAULT]
ServerAliveInterval = -1
>>> config_override = configparser.ConfigParser()
>>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'}
>>> with open('override.ini', 'w') as configfile:
... config_override.write(configfile)
...
>>> config_override = configparser.ConfigParser()
>>> config_override.read(['example.ini', 'override.ini'])
['example.ini', 'override.ini']
>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))
-1
این رفتار معادل فراخوانی ConfigParser.read() با چند پرونده است که به پارامتر filenames داده شدهاند.
انواع داده پشتیبانیشده¶
پارسرهای پیکربندی انواع دادهی مقادیر موجود در پروندههای پیکربندی را حدس نمیزنند و همیشه آنها را بهصورت داخلی بهعنوان رشته ذخیره میکنند. این بدان معناست که اگر به انواع داده دیگری نیاز دارید، باید خودتان آنها را تبدیل کنید:
>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0
از آنجا که این کار بسیار رایج است، پارسرهای پیکربندی (config parsers) مجموعهای از متدهای getter کاربردی را برای مدیریت اعداد صحیح، اعداد اعشاری و بولیها ارائه میکنند. آخرین مورد جالبترین است، زیرا صرفاً فرستادن مقدار به bool() فایدهای ندارد، چرا که bool('False') همچنان True است. به همین دلیل پارسرهای پیکربندی getboolean() را نیز ارائه میکنند. این متد به بزرگی و کوچکی حروف حساس نیست و مقادیر بولی را از 'yes'/'no'، 'on'/'off'، 'true'/'false' و '1'/'0' [1] تشخیص میدهد. برای مثال:
>>> topsecret.getboolean('ForwardX11')
False
>>> config['forge.example'].getboolean('ForwardX11')
True
>>> config.getboolean('forge.example', 'Compression')
True
علاوه بر getboolean()، پارسرهای پیکربندی همچنین متدهای معادل getint() و getfloat() را نیز ارائه میدهند. شما میتوانید مبدلهای خودتان را ثبت کنید و مبدلهای ارائهشده را سفارشیسازی کنید. [1]
مقادیر جایگزین¶
مانند دیکشنری، میتوانید از متد get() یک بخش برای ارائه مقادیر جایگزین استفاده کنید:
>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'
لطفاً توجه داشته باشید که مقادیر پیشفرض بر مقادیر جایگزین (fallback) اولویت دارند. برای مثال، در مثال ما کلید 'CompressionLevel' فقط در بخش 'DEFAULT' تعیین شده است. اگر سعی کنیم آن را از بخش 'topsecret.server.example' دریافت کنیم، همیشه مقدار پیشفرض را دریافت خواهیم کرد، حتی اگر یک مقدار جایگزین (fallback) تعیین کنیم:
>>> topsecret.get('CompressionLevel', '3')
'9'
نکته دیگری که باید از آن آگاه باشید این است که متد get() در سطح پارسر، رابطی سفارشی و پیچیدهتر را فراهم میکند که برای سازگاری با نسخههای پیشین حفظ شده است. هنگام استفاده از این متد، میتوانید یک مقدار جایگزین (fallback) را از طریق آرگومان فقط کلیدواژهای fallback ارائه دهید:
>>> config.get('forge.example', 'monster',
... fallback='No such things as monsters')
'No such things as monsters'
میتوان از همان آرگومان fallback در متدهای getint()، getfloat() و getboolean() استفاده کرد، برای مثال:
>>> 'BatchMode' in topsecret
False
>>> topsecret.getboolean('BatchMode', fallback=True)
True
>>> config['DEFAULT']['BatchMode'] = 'no'
>>> topsecret.getboolean('BatchMode', fallback=True)
False
ساختار پرونده INI پشتیبانیشده¶
یک پرونده پیکربندی از بخشها تشکیل شده است؛ هر بخش با یک سرآیند [section] آغاز میشود و پس از آن، ورودیهای کلید/مقدار قرار دارند که با یک رشته مشخص (بهصورت پیشفرض = یا : [1]) از هم جدا شدهاند. بهصورت پیشفرض، نام بخشها به بزرگی و کوچکی حروف حساس هستند، اما کلیدها حساس نیستند [1]. فضای سفید ابتدایی و انتهایی از کلیدها و مقدارها حذف میشود. در صورتی که پارسر بهگونهای پیکربندی شده باشد که حذف مقدارها مجاز باشد [1]، میتوان آنها را حذف کرد؛ در این صورت، جداکننده کلید/مقدار نیز میتواند حذف شود. مقدارها همچنین میتوانند چند خط را در بر بگیرند، مشروط بر اینکه نسبت به خط اول مقدار تورفتگی بیشتری داشته باشند. بسته به حالت پارسر، سطرهای خالی ممکن است بهعنوان بخشی از مقدارهای چندخطی در نظر گرفته شوند یا نادیده گرفته شوند.
بهطور پیشفرض، یک نام بخش معتبر میتواند هر رشتهای باشد که حاوی '\n' نیست. برای تغییر این، ConfigParser.SECTCRE را ببینید.
اگر پارسر بهگونهای پیکربندی شده باشد که با allow_unnamed_section=True اجازهی وجود یک بخش سطحبالای بینام داده شود، میتوان نام اولین بخش را حذف کرد. در این حالت، میتوان کلیدها/مقدارها را با استفاده از UNNAMED_SECTION، مانند config[UNNAMED_SECTION]، بازیابی کرد.
پروندههای پیکربندی ممکن است شامل کامنتهایی باشند که با نویسههای مشخصی آغاز میشوند (بهطور پیشفرض # و ; [1]). کامنتها ممکن است بهتنهایی در سطری که در غیر این صورت خالی است قرار بگیرند، احتمالاً با تورفتگی. [1]
برای مثال:
[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values
[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true
[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
I sleep all night and I work all day
[No Values]
key_without_value
empty string value here =
[You can use comments]
# like this
; or this
# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.
[Sections Can Be Indented]
can_values_be_as_well = True
does_that_mean_anything_special = False
purpose = formatting for readability
multiline_values = are
handled just fine as
long as they are indented
deeper than the first line
of a value
# Did I mention we can indent comments, too?
بخشهای بینام¶
نام اولین بخش (یا یکتا) میتواند حذف شود و مقادیر از طریق ویژگی UNNAMED_SECTION بازیابی شوند.
>>> config = """
... option = value
...
... [ Section 2 ]
... another = val
... """
>>> unnamed = configparser.ConfigParser(allow_unnamed_section=True)
>>> unnamed.read_string(config)
>>> unnamed.get(configparser.UNNAMED_SECTION, 'option')
'value'
درونیابی مقادیر¶
علاوه بر قابلیتهای اصلی، ConfigParser از درونیابی (interpolation) پشتیبانی میکند. این بدان معناست که میتوان مقادیر را پیش از بازگرداندن آنها از فراخوانیهای get() پیشپردازش کرد.
- class configparser.BasicInterpolation¶
پیادهسازی پیشفرضی که توسط
ConfigParserاستفاده میشود. این امکان را فراهم میکند که مقادیر شامل رشتههای قالببندی باشند که به مقادیر دیگر در همان بخش، یا مقادیر بخش پیشفرض خاص [1] ارجاع میدهند. میتوان مقادیر پیشفرض اضافی را در هنگام مقداردهی اولیه ارائه کرد.برای مثال:
[Paths] home_dir: /Users my_dir: %(home_dir)s/lumberjack my_pictures: %(my_dir)s/Pictures [Escape] # use a %% to escape the % sign (% is the only character that needs to be escaped): gain: 80%%
در مثال بالا،
ConfigParserکه درونیابی (interpolation) آن رویBasicInterpolation()تنظیم شده است،%(home_dir)sرا به مقدارhome_dirحل میکند (در این مورد/Users). در عمل،%(my_dir)sبه/Users/lumberjackحل میشود. همه درونیابیها در زمان نیاز انجام میشوند، بنابراین کلیدهای استفادهشده در زنجیرهای از ارجاعها لازم نیست با ترتیب خاصی در پرونده پیکربندی مشخص شوند.وقتی
interpolationرویNoneتنظیم شده باشد، پارسر بهسادگی%(my_dir)s/Picturesرا بهعنوان مقدارmy_picturesو%(home_dir)s/lumberjackرا بهعنوان مقدارmy_dirبرمیگرداند.
- class configparser.ExtendedInterpolation¶
یک هندلر جایگزین برای درونیابی (interpolation) که سینتکس پیشرفتهتری را پیادهسازی میکند و برای نمونه در
zc.buildoutاستفاده میشود. درونیابی گسترده از${section:option}برای مشخص کردن مقداری از یک بخش دیگر استفاده میکند. درونیابی میتواند چندین سطح را در بر بگیرد. برای سهولت، اگر قسمتsection:حذف شود، درونیابی بهطور پیشفرض از بخش جاری (و احتمالاً از مقادیر پیشفرض بخش ویژه) استفاده میکند.برای مثال، پیکربندی مشخصشده در بالا با درونیابی پایه، با درونیابی گسترده به این شکل خواهد بود:
[Paths] home_dir: /Users my_dir: ${home_dir}/lumberjack my_pictures: ${my_dir}/Pictures [Escape] # use a $$ to escape the $ sign ($ is the only character that needs to be escaped): cost: $$80
مقادیر بخشهای دیگر را نیز میتوان واکشی کرد:
[Common] home_dir: /Users library_dir: /Library system_dir: /System macports_dir: /opt/local [Frameworks] Python: 3.2 path: ${Common:system_dir}/Library/Frameworks/ [Arthur] nickname: Two Sheds last_name: Jackson my_dir: ${Common:home_dir}/twosheds my_pictures: ${my_dir}/Pictures python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
دسترسی به پروتکل نگاشت¶
اضافه شده در نسخهی 3.2.
دسترسی به پروتکل نگاشت نامی کلی برای قابلیتی است که امکان استفاده از اشیاء سفارشی را گویی آنها دیکشنری هستند، فراهم میکند. در مورد configparser، پیادهسازی رابط نگاشت از نمادگذاری parser['section']['option'] استفاده میکند.
parser['section'] بهطور خاص یک پراکسی برای دادههای بخش در پارسر برمیگرداند. این بدان معناست که مقادیر کپی نمیشوند، بلکه در صورت درخواست از پارسر اصلی گرفته میشوند. آنچه حتی مهمتر است این است که وقتی مقادیر روی یک پراکسی بخش تغییر میکنند، در واقع در پارسر اصلی تغییر مییابند.
اشیای configparser تا حد ممکن مانند دیکشنریهای واقعی رفتار میکنند. رابط نگاشت کامل است و از ABC MutableMapping پیروی میکند. با این حال، چند تفاوت وجود دارد که باید در نظر گرفته شوند:
بهطور پیشفرض، همه کلیدهای درون بخشها بهصورت غیرحساس به حروف کوچک و بزرگ قابل دسترسی هستند [1]. برای مثال،
for option in parser["section"]فقط نام کلیدهای گزینهای را که باoptionxformتبدیلشدهاند برمیگرداند. این یعنی کلیدها بهطور پیشفرض با حروف کوچک هستند. در عین حال، برای بخشی که کلید'a'را دارد، هر دو عبارتTrueرا برمیگردانند:"a" in parser["section"] "A" in parser["section"]
همهی بخشها شامل مقادیر
DEFAULTSECTنیز میشوند، به این معنا که.clear()روی یک بخش ممکن است بخش را بهصورت قابلمشاهدهای خالی نگذارد. دلیلش این است که نمیتوان مقادیر پیشفرض را از بخش حذف کرد (زیرا از نظر فنی در آنجا وجود ندارند). اگر این مقادیر در بخش بازنویسی شده باشند، حذف از بخش باعث میشود مقدار پیشفرض دوباره نمایان شود. تلاش برای حذف یک مقدار پیشفرض منجر بهKeyErrorمیشود.DEFAULTSECTرا نمیتوان از پارسر حذف کرد:تلاش برای حذف آن موجب پرتاب
ValueErrorمیشود،parser.clear()آن را دستنخورده باقی میگذارد،parser.popitem()هرگز آن را برنمیگرداند.
parser.get(section, option, **kwargs)- آرگومان دوم یک مقدار جایگزین نیست. با این حال توجه داشته باشید که متدهایget()در سطح بخش، هم با پروتکل نگاشت و هم با API کلاسیک configparser سازگار هستند.parser.items()با پروتکل نگاشت سازگار است (فهرستی از جفتهای section_name و section_proxy را برمیگرداند که DEFAULTSECT را نیز شامل میشود). با این حال، میتوان این متد را با آرگومانها نیز فراخوانی کرد:parser.items(section, raw, vars). فراخوانی دوم، فهرستی از جفتهای option و value را برای یکsectionمشخص برمیگرداند، بهطوری که همه درونیابیها (interpolations) بسط یافتهاند (مگر آنکهraw=Trueارائه شده باشد).
پروتکل نگاشت بر روی API قدیمی موجود پیادهسازی شده است، بهطوری که زیرکلاسهایی که رابط اصلی را بازنویسی میکنند نیز همچنان باید نگاشتهایی داشته باشند که طبق انتظار کار میکنند.
سفارشیسازی رفتار پارسر¶
تقریباً به تعداد برنامههایی که از قالب INI استفاده میکنند، گونههای مختلفی از این قالب وجود دارد. configparser تا حد زیادی پشتیبانی از بزرگترین مجموعهی معقول از سبکهای موجود INI را فراهم میکند. عملکرد پیشفرض عمدتاً تحت تأثیر پیشینهی تاریخی است و بسیار محتمل است که بخواهید برخی از قابلیتها را سفارشیسازی کنید.
رایجترین روش برای تغییر شیوهی کار یک پارسر پیکربندی (config parser) مشخص، استفاده از گزینههای __init__() است:
defaults، مقدار پیشفرض:
Noneاین گزینه یک دیکشنری از جفتهای کلید-مقدار را میپذیرد که در ابتدا در بخش
DEFAULTقرار میگیرند. این امر راهی ظریف برای پشتیبانی از پروندههای پیکربندی مختصر فراهم میکند که مقادیر همسان با پیشفرض مستندشده را مشخص نمیکنند.نکته: اگر میخواهید مقادیر پیشفرض برای یک بخش مشخص تعیین کنید، قبل از خواندن پرونده واقعی از
read_dict()استفاده کنید.dict_type، مقدار پیشفرض:
dictاین گزینه تأثیر عمدهای بر رفتار پروتکل نگاشت و ظاهر پروندههای پیکربندی نوشتهشده دارد. با دیکشنری استاندارد، هر بخش به ترتیبی که به پارسر افزوده شده است، ذخیره میشود. همین موضوع برای گزینههای درون بخشها نیز صدق میکند.
برای مثال، میتوان از یک نوع دیکشنری جایگزین برای مرتبسازی بخشها و گزینهها در زمان بازنویسی (write-back) استفاده کرد.
توجه داشته باشید: راههایی برای افزودن مجموعهای از جفتهای کلید-مقدار در یک عملیات وجود دارد. هنگامی که از یک دیکشنری معمولی در آن عملیاتها استفاده میکنید، ترتیب کلیدها حفظ خواهد شد. برای مثال:
>>> parser = configparser.ConfigParser() >>> parser.read_dict({'section1': {'key1': 'value1', ... 'key2': 'value2', ... 'key3': 'value3'}, ... 'section2': {'keyA': 'valueA', ... 'keyB': 'valueB', ... 'keyC': 'valueC'}, ... 'section3': {'foo': 'x', ... 'bar': 'y', ... 'baz': 'z'} ... }) >>> parser.sections() ['section1', 'section2', 'section3'] >>> [option for option in parser['section3']] ['foo', 'bar', 'baz']
allow_no_value، مقدار پیشفرض:
Falseشناخته شده است که برخی از پروندههای پیکربندی شامل تنظیمات بدون مقدار هستند، اما در غیر این صورت با سینتکس پشتیبانیشده توسط
configparserمطابقت دارند. میتوان از پارامتر allow_no_value در سازنده برای نشان دادن اینکه چنین مقادیری باید پذیرفته شوند استفاده کرد:>>> import configparser >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-external-locking ... old_passwords = 1 ... skip-bdb ... # we don't need ACID today ... skip-innodb ... """ >>> config = configparser.ConfigParser(allow_no_value=True) >>> config.read_string(sample_config) >>> # Settings with values are treated as before: >>> config["mysqld"]["user"] 'mysql' >>> # Settings without values provide None: >>> config["mysqld"]["skip-bdb"] >>> # Settings which aren't specified still raise an error: >>> config["mysqld"]["does-not-exist"] Traceback (most recent call last): ... KeyError: 'does-not-exist'
delimiters، مقدار پیشفرض:
('=', ':')جداکنندهها زیررشتههایی هستند که کلیدها را از مقادیر درون یک بخش جدا میکنند. نخستین رخداد یک زیررشته جداکننده در یک خط بهعنوان جداکننده در نظر گرفته میشود. این بدان معناست که مقادیر (نه کلیدها) میتوانند شامل جداکنندهها باشند.
همچنین آرگومان space_around_delimiters برای
ConfigParser.write()را ببینید.comment_prefixes، مقدار پیشفرض:
('#', ';')inline_comment_prefixes، مقدار پیشفرض:
Noneپیشوندهای کامنت رشتههایی هستند که آغاز یک کامنت معتبر در پرونده پیکربندی را نشان میدهند. comment_prefixes فقط در سطرهایی که در غیر این صورت خالی هستند (با تورفتگی اختیاری) استفاده میشوند، در حالی که inline_comment_prefixes میتوانند پس از هر مقدار معتبر (برای مثال نام بخشها، گزینهها و همچنین سطرها خالی) استفاده شوند. بهطور پیشفرض، کامنتهای درونخطی غیرفعال هستند و از
'#'و';'بهعنوان پیشوند برای کامنتهای کل خط استفاده میشود.تغییر یافته در نسخهی 3.2: در نسخههای پیشین
configparser، رفتار مطابقcomment_prefixes=('#',';')وinline_comment_prefixes=(';',)بود.لطفاً توجه داشته باشید که پارسرهای پیکربندی از خنثیسازی پیشوندهای کامنت پشتیبانی نمیکنند، بنابراین استفاده از inline_comment_prefixes ممکن است کاربران را از تعیین مقادیر گزینه حاوی نویسههایی که بهعنوان پیشوندهای کامنت استفاده میشوند، باز دارد. در صورت تردید، از تنظیم inline_comment_prefixes خودداری کنید. در هر شرایطی، تنها راه ذخیرهسازی نویسههای پیشوند کامنت در ابتدای یک خط در مقادیر چندخطی، درونیابی پیشوند است، برای مثال:
>>> from configparser import ConfigParser, ExtendedInterpolation >>> parser = ConfigParser(interpolation=ExtendedInterpolation()) >>> # the default BasicInterpolation could be used as well >>> parser.read_string(""" ... [DEFAULT] ... hash = # ... ... [hashes] ... shebang = ... ${hash}!/usr/bin/env python ... ${hash} -*- coding: utf-8 -*- ... ... extensions = ... enabled_extension ... another_extension ... #disabled_by_comment ... yet_another_extension ... ... interpolation not necessary = if # is not at line start ... even in multiline values = line #1 ... line #2 ... line #3 ... """) >>> print(parser['hashes']['shebang']) #!/usr/bin/env python # -*- coding: utf-8 -*- >>> print(parser['hashes']['extensions']) enabled_extension another_extension yet_another_extension >>> print(parser['hashes']['interpolation not necessary']) if # is not at line start >>> print(parser['hashes']['even in multiline values']) line #1 line #2 line #3
strict، مقدار پیشفرض:
Trueهنگامی که روی
Trueتنظیم شود، پارسر هنگام خواندن از یک منبع واحد (با استفاده ازread_file()،read_string()یاread_dict()) اجازه نمیدهد هیچ بخش یا گزینهای تکرار شود. توصیه میشود در برنامههای کاربردی جدید از پارسرهای سختگیر استفاده شود.تغییر یافته در نسخهی 3.2: در نسخههای پیشین
configparser، رفتار باstrict=Falseمطابقت داشت.empty_lines_in_values، مقدار پیشفرض:
Trueدر پارسرهای پیکربندی، مقدارها میتوانند چندین خط را در بر بگیرند، بهشرطی که تورفتگی آنها بیشتر از کلیدی باشد که آنها را نگه میدارد. بهطور پیشفرض، پارسرها همچنین اجازه میدهند سطرهای خالی بخشی از مقدارها باشند. در عین حال، خود کلیدها نیز میتوانند بهدلخواه تورفتگی داشته باشند تا خوانایی بهبود یابد. در نتیجه، هنگامی که پروندههای پیکربندی بزرگ و پیچیده میشوند، ممکن است کاربر بهراحتی رد ساختار پرونده را گم کند. برای نمونه:
[Section] key = multiline value with a gotcha this = is still a part of the multiline value of 'key'
دیدن این موضوع میتواند برای کاربر بهویژه مشکلساز باشد، اگر برای ویرایش پرونده از قلم متناسب استفاده کند. به همین دلیل، هنگامی که برنامه شما به مقادیر دارای سطرهای خالی نیازی ندارد، باید در نظر بگیرید که آنها را غیرمجاز کنید. این کار باعث میشود سطرهای خالی هر بار کلیدها را جدا کنند. در مثال بالا، این کار دو کلید،
keyوthis، تولید میکند.default_section، مقدار پیشفرض:
configparser.DEFAULTSECT(یعنی"DEFAULT")قراردادِ وجود یک بخش ویژه از مقادیر پیشفرض برای سایر بخشها یا اهداف درونیابی (interpolation)، مفهوم قدرتمندی در این کتابخانه است که به کاربران امکان میدهد پیکربندیهای اعلامی پیچیدهای ایجاد کنند. این بخش معمولاً
"DEFAULT"نامیده میشود، اما میتوان آن را سفارشیسازی کرد تا به هر نام بخش معتبر دیگری اشاره کند. برخی مقادیر معمول عبارتاند از:"general"یا"common". نام ارائهشده برای شناسایی بخشهای پیشفرض هنگام خواندن از هر منبعی استفاده میشود و همچنین هنگام نوشتن پیکربندی به یک پرونده نیز به کار میرود. مقدار فعلی آن را میتوان با استفاده از ویژگیparser_instance.default_sectionدریافت کرد و میتوان آن را در رانتایم تغییر داد (یعنی برای تبدیل پروندهها از یک قالب به قالب دیگر).interpolation، مقدار پیشفرض:
configparser.BasicInterpolationمیتوان رفتار درونیابی (interpolation) را با ارائه یک هندلر سفارشی از طریق آرگومان interpolation سفارشیسازی کرد. میتوان از
Noneبرای غیرفعال کردن کامل درونیابی استفاده کرد؛ExtendedInterpolation()گونهای پیشرفتهتر را فراهم میکند که ازzc.buildoutالهامگرفته است. اطلاعات بیشتر درباره این موضوع در بخش اختصاصی مستندات آمده است.RawConfigParserدارای مقدار پیشفرضNoneاست.converters، مقدار پیشفرض: تنظیمنشده
پارسرهای پیکربندی، دریابندههای مقدار گزینه را فراهم میکنند که تبدیل نوع را انجام میدهند. بهطور پیشفرض
getint()،getfloat()وgetboolean()پیادهسازی شدهاند. در صورت نیاز به دریابندههای دیگر، کاربران میتوانند آنها را در یک زیرکلاس تعریف کنند یا یک دیکشنری ارسال کنند که هر کلید آن نام مبدل و هر مقدار آن یک شیء فراخوانیپذیر است که تبدیل مذکور را پیادهسازی میکند. برای مثال، ارسال{'decimal': decimal.Decimal}باعث میشودgetdecimal()هم به شیء پارسر و هم به تمام پراکسیهای بخش اضافه شود. به بیان دیگر، امکان نوشتن هر دوparser_instance.getdecimal('section', 'key', fallback=0)وparser_instance['section'].getdecimal('key', 0)وجود خواهد داشت.اگر مبدل نیاز به دسترسی به وضعیت پارسر داشته باشد، میتوان آن را بهصورت متدی در یک زیرکلاس پارسر پیکربندی پیادهسازی کرد. اگر نام این متد با
getآغاز شود، در همه پراکسیهای بخش، در قالب سازگار با دیکشنری در دسترس خواهد بود (مثالgetdecimal()بالا را ببینید).
با تغییر مقادیر پیشفرض این ویژگیهای پارسر میتوان به سفارشیسازی پیشرفتهتری دست یافت. مقادیر پیشفرض روی کلاسها تعریف شدهاند، بنابراین میتوان آنها را در زیرکلاسها یا از طریق انتساب ویژگی تغییر داد.
- ConfigParser.BOOLEAN_STATES¶
بهطور پیشفرض هنگام استفاده از
getboolean()، پارسرهای پیکربندی مقادیر زیر راTrueدر نظر میگیرند:'1'،'yes'،'true'،'on'و مقادیر زیر راFalseدر نظر میگیرند:'0'،'no'،'false'،'off'. میتوانید این پیشفرض را با مشخص کردن یک دیکشنری سفارشی از رشتهها و نتایج بولی آنها تغییر دهید. برای مثال:>>> custom = configparser.ConfigParser() >>> custom['section1'] = {'funky': 'nope'} >>> custom['section1'].getboolean('funky') Traceback (most recent call last): ... ValueError: Not a boolean: nope >>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False} >>> custom['section1'].getboolean('funky') False
سایر جفتهای بولی رایج شامل
accept/rejectیاenabled/disabledهستند.
- ConfigParser.optionxform(option)
این متد نام گزینهها را در هر عملیات خواندن، دریافت یا تنظیم تبدیل میکند. حالت پیشفرض نام را به حروف کوچک تبدیل میکند. این همچنین به این معناست که هنگامی که یک پرونده پیکربندی نوشته میشود، همه کلیدها با حروف کوچک خواهند بود. اگر این مناسب نیست، این متد را بازنویسی کنید. برای مثال:
>>> config = """ ... [Section1] ... Key = Value ... ... [Section2] ... AnotherKey = Value ... """ >>> typical = configparser.ConfigParser() >>> typical.read_string(config) >>> list(typical['Section1'].keys()) ['key'] >>> list(typical['Section2'].keys()) ['anotherkey'] >>> custom = configparser.RawConfigParser() >>> custom.optionxform = lambda option: option >>> custom.read_string(config) >>> list(custom['Section1'].keys()) ['Key'] >>> list(custom['Section2'].keys()) ['AnotherKey']
توجه
تابع optionxform نام گزینهها را به یک صورت کانونیکال تبدیل میکند. این باید یک تابع همتوان (idempotent) باشد: اگر نام از قبل در صورت کانونیکال باشد، باید بدون تغییر بازگردانده شود.
- ConfigParser.SECTCRE¶
یک عبارت باقاعده کامپایلشده که برای تجزیه سرآیندهای بخش استفاده میشود. مقدار پیشفرض
[section]را با نام"section"تطبیق میدهد. فضای سفید بهعنوان بخشی از نام بخش در نظر گرفته میشود، بنابراین[ larch ]بهعنوان بخشی با نام" larch "خوانده میشود. اگر این مناسب نیست، این ویژگی را بازنویسی کنید. برای مثال:>>> import re >>> config = """ ... [Section 1] ... option = value ... ... [ Section 2 ] ... another = val ... """ >>> typical = configparser.ConfigParser() >>> typical.read_string(config) >>> typical.sections() ['Section 1', ' Section 2 '] >>> custom = configparser.ConfigParser() >>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]") >>> custom.read_string(config) >>> custom.sections() ['Section 1', 'Section 2']
توجه
اگرچه اشیای ConfigParser همچنین از یک ویژگی
OPTCREبرای تشخیص سطرهای گزینه استفاده میکنند، توصیه نمیشود آن را بازنویسی کنید، زیرا این کار با گزینههای سازنده یعنی allow_no_value و delimiters تداخل ایجاد میکند.
نمونههای API قدیمی¶
عمدتاً به دلیل ملاحظات سازگاری با نسخههای قبلی، configparser همچنین یک API قدیمی با متدهای صریح get/set ارائه میدهد. اگرچه برای متدهایی که در زیر توضیح داده شدهاند موارد استفاده معتبری وجود دارد، دسترسی از طریق پروتکل نگاشت برای پروژههای جدید ترجیح داده میشود. API قدیمی گاهی اوقات پیشرفتهتر، سطح پایینتر و کاملاً غیرشهودی است.
مثالی از نوشتن در یک پرونده پیکربندی:
import configparser
config = configparser.RawConfigParser()
# Please note that using RawConfigParser's set functions, you can assign
# non-string values to keys internally, but will receive an error when
# attempting to write to a file or when you get it in non-raw mode. Setting
# values using the mapping protocol or ConfigParser's set() does not allow
# such assignments to take place.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')
# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'w') as configfile:
config.write(configfile)
مثالی از خواندن دوبارهی پرونده پیکربندی:
import configparser
config = configparser.RawConfigParser()
config.read('example.cfg')
# getfloat() raises an exception if the value is not a float
# getint() and getboolean() also do this for their respective types
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print(a_float + an_int)
# Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
# This is because we are using a RawConfigParser().
if config.getboolean('Section1', 'a_bool'):
print(config.get('Section1', 'foo'))
برای درونیابی (interpolation)، از ConfigParser استفاده کنید:
import configparser
cfg = configparser.ConfigParser()
cfg.read('example.cfg')
# Set the optional *raw* argument of get() to True if you wish to disable
# interpolation in a single get operation.
print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!"
print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!"
# The optional *vars* argument is a dict with members that will take
# precedence in interpolation.
print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',
'baz': 'evil'}))
# The optional *fallback* argument can be used to provide a fallback value
print(cfg.get('Section1', 'foo'))
# -> "Python is fun!"
print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
# -> "Python is fun!"
print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
# -> "No such things as monsters."
# A bare print(cfg.get('Section1', 'monster')) would raise NoOptionError
# but we can also use:
print(cfg.get('Section1', 'monster', fallback=None))
# -> None
مقادیر پیشفرض در هر دو نوع ConfigParser در دسترس هستند. اگر گزینهی استفادهشده در جای دیگری تعریفنشده باشد، این مقادیر در درونیابی (interpolation) استفاده میشوند.
import configparser
# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})
config.read('example.cfg')
print(config.get('Section1', 'foo')) # -> "Python is fun!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print(config.get('Section1', 'foo')) # -> "Life is hard!"
اشیای ConfigParser¶
- class configparser.ConfigParser(defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={}, allow_unnamed_section=False)¶
پارسر اصلی پیکربندی. هنگامی که defaults داده شود، در دیکشنری پیشفرضهای ذاتی مقداردهی اولیه میشود. هنگامی که dict_type داده شود، برای ایجاد اشیای دیکشنری برای فهرست بخشها، برای گزینههای درون یک بخش، و برای مقادیر پیشفرض استفاده خواهد شد.
هنگامی که delimiters داده شده باشد، از آن بهعنوان مجموعهای از زیررشتهها استفاده میشود که کلیدها را از مقادیر جدا میکنند. هنگامی که comment_prefixes داده شده باشد، از آن بهعنوان مجموعهای از زیررشتهها استفاده خواهد شد که بهعنوان پیشوند کامنتها در سطرهایی که در غیر این صورت خالی هستند، عمل میکنند. کامنتها میتوانند تورفتگی داشته باشند. هنگامی که inline_comment_prefixes داده شده باشد، از آن بهعنوان مجموعهای از زیررشتهها استفاده خواهد شد که بهعنوان پیشوند کامنتها در سطرهای غیرخالی عمل میکنند.
هنگامی که strict برابر
Trueباشد (پیشفرض)، پارسر هنگام خواندن از یک منبع واحد (پرونده، رشته یا دیکشنری) از وجود هرگونه بخش یا گزینه تکراری جلوگیری میکند وDuplicateSectionErrorیاDuplicateOptionErrorرا پرتاب میکند. هنگامی که empty_lines_in_values برابرFalseباشد (پیشفرض:True)، هر خط خالی پایان یک گزینه را مشخص میکند. در غیر این صورت، سطرهای خالی داخلی یک گزینه چندخطی بهعنوان بخشی از مقدار حفظ میشوند. هنگامی که allow_no_value برابرTrueباشد (پیشفرض:False)، گزینههای بدون مقدار پذیرفته میشوند؛ مقدار ذخیرهشده برای این گزینههاNoneاست و آنها بدون جداکننده پایانی سریالسازی میشوند.هنگامی که default_section داده شود، نام بخش ویژهای را مشخص میکند که مقادیر پیشفرض برای سایر بخشها و برای اهداف درونیابی را نگه میدارد (این بخش معمولاً
"DEFAULT"نام دارد). این مقدار را میتوان در رانتایم با استفاده از ویژگی نمونهیdefault_sectionبازیابی و تغییر داد. این کار یک پروندهی پیکربندی از پیش تجزیهشده را دوباره ارزیابی نمیکند، اما هنگام نوشتن تنظیمات تجزیهشده در یک پروندهی پیکربندی جدید استفاده خواهد شد.رفتار درونیابی (interpolation) را میتوان با ارائه یک هندلر سفارشی از طریق آرگومان interpolation سفارشیسازی کرد. میتوان از
Noneبرای غیرفعال کردن کامل درونیابی استفاده کرد، وExtendedInterpolation()یک گونه پیشرفتهتر ارائه میدهد که ازzc.buildoutالهام گرفته است. اطلاعات بیشتر درباره این موضوع در بخش اختصاصی مستندات.تمام نامهای گزینهای که در درونیابی (interpolation) استفاده میشوند، دقیقاً مانند هر ارجاع دیگری به نام گزینه، از متد
optionxform()عبور میکنند. برای مثال، با استفاده از پیادهسازی پیشفرضoptionxform()(که نام گزینهها را به حروف کوچک تبدیل میکند)، مقادیرfoo %(bar)sوfoo %(BAR)sمعادل هستند.هنگامی که converters داده شود، باید یک دیکشنری باشد که در آن هر کلید نشاندهندهی نام یک مبدل نوع است و هر مقدار یک شیء فراخوانیپذیر است که تبدیل از رشته به نوع داده مورد نظر را پیادهسازی میکند. هر مبدل متد
get*()متناظر با خود را روی شیء پارسر و پراکسیهای بخش دریافت میکند.هنگامی که allow_unnamed_section
Trueباشد (پیشفرض:False)، میتوان نام بخش نخست را حذف کرد. بخش «بخشهای بینام» <#unnamed-sections>`_ را ببینید.میتوان چند پیکربندی را در یک
ConfigParserخواند، که در آن آخرین پیکربندی اضافهشده بیشترین اولویت را دارد. کلیدهای متعارض از پیکربندی جدیدتر گرفته میشوند، در حالی که کلیدهای از پیش موجود حفظ میشوند. مثال زیر پروندهoverride.iniرا میخواند که کلیدهای متعارض موجود در پروندهexample.iniرا بازنویسی میکند.[DEFAULT] ServerAliveInterval = -1
>>> config_override = configparser.ConfigParser() >>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'} >>> with open('override.ini', 'w') as configfile: ... config_override.write(configfile) ... >>> config_override = configparser.ConfigParser() >>> config_override.read(['example.ini', 'override.ini']) ['example.ini', 'override.ini'] >>> print(config_override.get('DEFAULT', 'ServerAliveInterval')) -1
تغییر یافته در نسخهی 3.1: dict_type پیشفرض
collections.OrderedDictاست.تغییر یافته در نسخهی 3.2: allow_no_value، delimiters، comment_prefixes، strict، empty_lines_in_values، default_section و interpolation افزوده شدند.
تغییر یافته در نسخهی 3.5: آرگومان converters افزوده شد.
تغییر یافته در نسخهی 3.7: آرگومان defaults با
read_dict()خوانده میشود و رفتار سازگاری را در سراسر پارسر فراهم میکند: کلیدها و مقدارهای غیررشتهای بهصورت ضمنی به رشته تبدیل میشوند.تغییر یافته در نسخهی 3.8: مقدار پیشفرض dict_type،
dictاست، زیرا اکنون ترتیب درج را حفظ میکند.تغییر یافته در نسخهی 3.13: هنگامی که allow_no_value برابر
Trueباشد و یک کلید بدون مقدار با یک خط دارای تورفتگی ادامه یابد، یکMultilineContinuationErrorپرتاب میشود.تغییر یافته در نسخهی 3.13: آرگومان allow_unnamed_section افزوده شد.
- defaults()¶
یک دیکشنری شامل پیشفرضهای سراسری نمونه برمیگرداند.
- sections()¶
فهرستی از بخشهای موجود را برمیگرداند؛ بخش پیشفرض در این فهرست گنجانده نشده است.
- add_section(section)¶
یک بخش با نام section به نمونه اضافه میکند. اگر بخشی با نام دادهشده از قبل وجود داشته باشد، استثنای
DuplicateSectionErrorپرتاب میشود. اگر نام بخش پیشفرض داده شود، استثنایValueErrorپرتاب میشود. نام بخش باید یک رشته باشد؛ در غیر این صورت، استثنایTypeErrorپرتاب میشود.تغییر یافته در نسخهی 3.2: نامبخشهای غیررشتهای باعث پرتاب
TypeErrorمیشوند.
- has_section(section)¶
نشان میدهد که آیا section نامبرده در پیکربندی وجود دارد یا خیر. بخش پیشفرض شناسایی نمیشود.
- options(section)¶
فهرستی از گزینههای موجود در section مشخصشده را برمیگرداند.
- has_option(section, option)¶
اگر section دادهشده وجود داشته باشد و شامل option دادهشده باشد،
Trueرا برمیگرداند؛ در غیر این صورتFalseرا برمیگرداند. اگر section مشخصشدهNoneیا یک رشته خالی باشد، DEFAULT در نظر گرفته میشود.
- read(filenames, encoding=None)¶
تلاش میکند یک پیمایشپذیر از نام پروندهها را بخواند و تجزیه کند، و فهرستی از نام پروندههایی را که با موفقیت تجزیه شدهاند برمیگرداند.
اگر filenames یک رشته، یک شیء
bytesیا یک شیء شبهمسیر (path-like object) باشد، بهعنوان یک نام پرونده واحد در نظر گرفته میشود. اگر نتوان پروندهای را که در filenames ذکر شده است باز کرد، از آن پرونده چشمپوشی خواهد شد. این به گونهای طراحی شده است که شما بتوانید یک پیمایشپذیر از محلهای احتمالی برای پروندههای پیکربندی مشخص کنید (برای مثال، پوشه جاری، پوشه خانه کاربر، و یک پوشه سراسری سیستم)، و همه پروندههای پیکربندی موجود در آن پیمایشپذیر خوانده خواهند شد.اگر هیچکدام از پروندههای نامبردهشده وجود نداشته باشند، نمونهی
ConfigParserحاوی یک مجموعهداده خالی خواهد بود. برنامهای که نیازمند بارگذاری مقادیر اولیه از یک پرونده است، باید پرونده یا پروندههای موردنیاز را با استفاده ازread_file()بارگذاری کند، پیش از فراخوانیread()برای هر پرونده اختیاری:import configparser, os config = configparser.ConfigParser() config.read_file(open('defaults.cfg')) config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')], encoding='cp1250')
تغییر یافته در نسخهی 3.2: پارامتر encoding افزوده شد. پیش از این، تمام پروندهها با کدگذاری پیشفرض
open()خوانده میشدند.تغییر یافته در نسخهی 3.6.1: پارامتر filenames یک شیء شبهمسیر (path-like object) را میپذیرد.
تغییر یافته در نسخهی 3.7: پارامتر filenames یک شیء
bytesرا میپذیرد.
- read_file(f, source=None)¶
دادههای پیکربندی را از f بخوانید و تجزیه کنید؛ f باید پیمایشپذیری باشد که رشتههای یونیکد تولید میکند (برای مثال پروندههایی که در حالت متنی باز شدهاند).
آرگومان اختیاری source نام پروندهای که خوانده میشود را مشخص میکند. اگر داده نشود و f ویژگی
nameداشته باشد، از آن برای source استفاده میشود؛ مقدار پیشفرض'<???>'است.اضافه شده در نسخهی 3.2: جایگزین
readfp()میشود.
- read_string(string, source='<string>')¶
تجزیه دادههای پیکربندی از یک رشته.
آرگومان اختیاری source نامی وابسته به زمینه برای رشتهی دادهشده مشخص میکند. اگر داده نشود، از
'<string>'استفاده میشود. این معمولاً باید یک مسیر سامانه فایلبندی یا یک URL باشد.اضافه شده در نسخهی 3.2.
- read_dict(dictionary, source='<dict>')¶
پیکربندی از هر شیءای که متد
items()دیکشنریمانند را فراهم میکند، بارگذاری میشود. کلیدها نام بخشها هستند؛ مقدارها دیکشنریهایی هستند که کلیدها و مقدارهای آنها باید در آن بخش وجود داشته باشند. اگر نوع دیکشنری استفادهشده ترتیب را حفظ کند، بخشها و کلیدهای آنها بهترتیب اضافه خواهند شد. مقدارها بهطور خودکار به رشته تبدیل میشوند.آرگومان اختیاری source نامی مختص به زمینه برای دیکشنری ارسالشده مشخص میکند. اگر داده نشود، از
<dict>استفاده میشود.میتوان از این متد برای کپی وضعیت بین پارسرها استفاده کرد.
اضافه شده در نسخهی 3.2.
- get(section, option, *, raw=False, vars=None[, fallback])¶
مقدار یک option را برای section مشخصشده دریافت کنید. اگر vars ارائه شده باشد، باید یک دیکشنری باشد. option بهترتیب در vars (در صورت ارائه)، section و در DEFAULTSECT جستجو میشود. اگر کلید پیدا نشود و fallback ارائه شده باشد، بهعنوان مقدار جایگزین استفاده میشود. میتوان
Noneرا بهعنوان مقدار fallback ارائه کرد.تمام درونیابیهای
'%'در مقادیر بازگشتی بسط داده میشوند، مگر اینکه آرگومان raw صحیح باشد. مقادیر کلیدهای درونیابی به همان شیوهای که گزینه جستوجو میشود، جستوجو میشوند.تغییر یافته در نسخهی 3.2: آرگومانهای raw، vars و fallback فقط کلیدواژهای هستند تا از تلاش کاربران برای استفاده از سومین آرگومان بهعنوان مقدار جایگزین (fallback) برای fallback جلوگیری شود (بهویژه هنگام استفاده از پروتکل نگاشت).
- getint(section, option, *, raw=False, vars=None[, fallback])¶
متدی آسانکننده که option را در section مشخصشده به عدد صحیح تبدیل میکند. برای توضیح raw، vars و fallback به
get()مراجعه کنید.
- getfloat(section, option, *, raw=False, vars=None[, fallback])¶
متد آسانکنندهای که option را در section مشخصشده به یک عدد ممیز شناور تبدیل میکند. برای توضیحات مربوط به raw، vars و fallback به
get()مراجعه کنید.
- getboolean(section, option, *, raw=False, vars=None[, fallback])¶
یک متد سهولتبخش که option را در section مشخصشده به یک مقدار بولی تبدیل میکند. توجه داشته باشید که مقادیر پذیرفتهشده برای گزینه عبارتاند از
'1'،'yes'،'true'و'on'که باعث میشوند این متدTrueرا برگرداند، و'0'،'no'،'false'و'off'که باعث میشوند این متدFalseرا برگرداند. این مقادیر رشتهای بهصورت غیرحساس به بزرگی و کوچکی حروف بررسی میشوند. هر مقدار دیگری باعث میشود این متدValueErrorرا پرتاب کند. برای توضیح raw، vars و fallback بهget()مراجعه کنید.
- items(raw=False, vars=None)¶
- items(section, raw=False, vars=None)
هنگامی که section داده نشده باشد، فهرستی از جفتهای section_name و section_proxy شامل DEFAULTSECT را برمیگرداند.
در غیر این صورت، فهرستی از جفتهای name، value برای گزینههای موجود در section دادهشده برمیگرداند. آرگومانهای اختیاری همان معنایی را دارند که برای متد
get()دارند.تغییر یافته در نسخهی 3.8: آیتمهای موجود در vars دیگر در نتیجه ظاهر نمیشوند. رفتار پیشین، گزینههای واقعی پارسر را با متغیرهای ارائهشده برای درونیابی (interpolation) مخلوط میکرد.
- set(section, option, value)¶
اگر بخش دادهشده وجود داشته باشد، گزینهی دادهشده را به مقدار مشخصشده تنظیم میکند؛ در غیر این صورت
NoSectionErrorپرتاب میشود. option و value باید رشته باشند؛ در غیر این صورتTypeErrorپرتاب میشود.
- write(fileobject, space_around_delimiters=True)¶
بازنماییای از پیکربندی را در file object مشخص بنویسید، که باید در حالت متنی باز شده باشد (و رشتهها را بپذیرد). این بازنمایی را میتوان با یک فراخوانی بعدی
read()تجزیه کرد. اگر space_around_delimiters برابر true باشد، جداکنندههای بین کلیدها و مقدارها با فاصله احاطه میشوند.تغییر یافته در نسخهی 3.14: در صورتی که این عمل منجر به نوشتن بازنماییای شود که یک فراخوانی آینده
read()از این پارسر نتواند آن را بهدقت تجزیه کند، InvalidWriteError را پرتاب میکند.
توجه
کامنتهای موجود در پرونده پیکربندی اصلی، هنگام نوشتن مجدد پیکربندی حفظ نمیشوند. اینکه چه چیزی کامنت در نظر گرفته میشود، به مقادیر دادهشده برای comment_prefix و inline_comment_prefix بستگی دارد.
- remove_option(section, option)¶
option مشخصشده را از section مشخصشده حذف میکند. اگر بخش وجود نداشته باشد،
NoSectionErrorرا پرتاب میکند. اگر گزینه برای حذف وجود داشته باشد،Trueرا برمیگرداند؛ در غیر این صورتFalseرا برمیگرداند.
- remove_section(section)¶
section مشخصشده را از پیکربندی حذف میکند. اگر بخش در واقع وجود داشته باشد،
Trueبرمیگرداند. در غیر این صورتFalseبرمیگرداند.
- optionxform(option)¶
نام گزینه option را، همانگونه که در یک پرونده ورودی یافت میشود یا توسط کد کلاینت ارسال میشود، به شکلی تبدیل میکند که باید در ساختارهای داخلی استفاده شود. پیادهسازی پیشفرض، نسخهای با حروف کوچک از option را برمیگرداند؛ زیرکلاسها میتوانند این را بازنویسی کنند یا کد کلاینت میتواند ویژگیای به این نام را روی نمونهها تنظیم کند تا بر این رفتار اثر بگذارد.
برای استفاده از این متد نیازی نیست پارسر را زیرکلاس کنید؛ میتوانید آن را بر روی یک نمونه نیز به تابعی تنظیم کنید که یک آرگومان رشتهای دریافت میکند و یک رشته برمیگرداند. برای مثال، تنظیم آن به
strباعث میشود نام گزینهها به بزرگی و کوچکی حروف حساس شوند:cfgparser = ConfigParser() cfgparser.optionxform = str
توجه داشته باشید که هنگام خواندن پروندههای پیکربندی، فاصلههای سفید اطراف نام گزینهها پیش از فراخوانی
optionxform()حذف میشود.
- configparser.UNNAMED_SECTION¶
یک شیء خاص که نشاندهندهی نام بخش است و برای ارجاع به بخش بینام استفاده میشود (به بخشهای بینام مراجعه کنید).
اشیای RawConfigParser¶
- class configparser.RawConfigParser(defaults=None, dict_type=dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={}, allow_unnamed_section=False)¶
گونهای قدیمی از
ConfigParser. درونیابی در آن بهطور پیشفرض غیرفعال است و از طریق متدهای ناامنadd_sectionوsetو نیز مدیریت قدیمی آرگومان کلیدواژهایdefaults=، امکان استفاده از نامهای بخش، نامهای گزینه و مقادیر غیررشتهای را فراهم میکند.تغییر یافته در نسخهی 3.2: allow_no_value، delimiters، comment_prefixes، strict، empty_lines_in_values، default_section و interpolation افزوده شدند.
تغییر یافته در نسخهی 3.5: آرگومان converters افزوده شد.
تغییر یافته در نسخهی 3.8: مقدار پیشفرض dict_type،
dictاست، زیرا اکنون ترتیب درج را حفظ میکند.تغییر یافته در نسخهی 3.13: آرگومان allow_unnamed_section افزوده شد.
توجه
در عوض، استفاده از
ConfigParserرا در نظر بگیرید که نوع مقادیری را که باید بهصورت داخلی ذخیره شوند بررسی میکند. اگر درونیابی نمیخواهید، میتوانید ازConfigParser(interpolation=None)استفاده کنید.- add_section(section)¶
یک بخش با نام section یا
UNNAMED_SECTIONبه نمونه اضافه میکند.اگر بخش دادهشده از قبل وجود داشته باشد،
DuplicateSectionErrorپرتاب میشود. اگر نام بخش پیشفرض داده شود،ValueErrorپرتاب میشود. اگرUNNAMED_SECTIONداده شود و پشتیبانی غیرفعال باشد،UnnamedSectionDisabledErrorپرتاب میشود.نوع section بررسی نمیشود و این به کاربران امکان میدهد بخشهایی با نامهای غیررشتهای ایجاد کنند. این رفتار پشتیبانی نمیشود و ممکن است باعث خطاهای داخلی شود.
تغییر یافته در نسخهی 3.14: پشتیبانی از
UNNAMED_SECTIONافزوده شد.- set(section, option, value)¶
اگر بخش دادهشده وجود داشته باشد، گزینهی دادهشده به مقدار مشخصشده تنظیم میشود؛ در غیر این صورت
NoSectionErrorپرتاب میشود. اگرچه میتوان ازRawConfigParser(یاConfigParserبا پارامترهای raw که به true تنظیم شدهاند) برای ذخیرهسازی داخلی مقادیر غیررشتهای استفاده کرد، اما قابلیت کامل (شامل درونیابی و خروجی به پروندهها) تنها با استفاده از مقادیر رشتهای امکانپذیر است.این متد به کاربران اجازه میدهد که مقادیر غیررشتهای را بهصورت داخلی به کلیدها منتسب کنند. این رفتار پشتیبانی نمیشود و هنگام تلاش برای نوشتن در یک پرونده یا دریافت آن در حالت غیرخام، باعث بروز خطاها خواهد شد. از API پروتکل نگاشت استفاده کنید که چنین انتسابهایی را مجاز نمیداند.
استثناها¶
- exception configparser.Error¶
کلاس پایه برای تمام استثناهای دیگر
configparser.
- exception configparser.NoSectionError¶
استثنایی که هنگام پیدا نشدن بخش مشخصشده پرتاب میشود.
- exception configparser.DuplicateSectionError¶
استثنایی پرتاب میشود اگر
add_section()با نام بخشی که از قبل موجود است فراخوانی شود، یا در پارسرهای سختگیر وقتی بخشی بیش از یک بار در یک پرونده ورودی، رشته یا دیکشنری واحد یافت شود.تغییر یافته در نسخهی 3.2: ویژگیها و پارامترهای اختیاری source و lineno به
__init__()اضافه شدند.
- exception configparser.DuplicateOptionError¶
استثنایی که توسط پارسرهای سختگیر در صورتی پرتاب میشود که یک گزینه هنگام خواندن از یک پرونده، رشته یا دیکشنری واحد دو بار ظاهر شود. این امر غلطهای املایی و خطاهای مربوط به حساسیت به حروف کوچک و بزرگ را شناسایی میکند، برای مثال ممکن است یک دیکشنری دو کلید داشته باشد که نشاندهندهی یک کلید پیکربندی بدون حساسیت به حروف کوچک و بزرگ باشند.
- exception configparser.NoOptionError¶
استثنایی که هنگامی پرتاب میشود که گزینهی مشخصشده در بخش مشخصشده یافت نشود.
- exception configparser.InterpolationError¶
کلاس پایه برای استثناهایی که هنگام بروز مشکلات در انجام درونیابی رشته پرتاب میشوند.
- exception configparser.InterpolationDepthError¶
استثنایی که هنگامی پرتاب میشود که درونیابی رشته نمیتواند تکمیل شود، زیرا تعداد تکرارها از
MAX_INTERPOLATION_DEPTHفراتر میرود. زیرکلاسی ازInterpolationError.
- exception configparser.InterpolationMissingOptionError¶
استثنایی که هنگامی پرتاب میشود که گزینهای که از یک مقدار به آن ارجاع داده شده است وجود نداشته باشد. زیرکلاسی از
InterpolationError.
- exception configparser.InterpolationSyntaxError¶
استثنایی که در صورتی پرتاب میشود که متن منبعی که جایگذاریها در آن انجام میشوند، با سینتکس مورد نیاز مطابقت نداشته باشد. زیرکلاسی از
InterpolationErrorاست.
- exception configparser.MissingSectionHeaderError¶
استثنایی که هنگام تلاش برای تجزیهی پروندهای که هیچ سرآیند بخشی ندارد پرتاب میشود.
- exception configparser.ParsingError¶
استثنایی که هنگام بروز خطا در تلاش برای تجزیهی یک پرونده پرتاب میشود.
تغییر یافته در نسخهی 3.12: ویژگی
filenameو آرگومان سازندهی__init__()حذف شدهاند. این موارد از 3.2 با استفاده از نامsourceدر دسترس بودهاند.
- exception configparser.MultilineContinuationError¶
استثنایی که هنگامی پرتاب میشود که یک کلید بدون مقدار متناظر، با یک خط تورفته ادامه یابد.
اضافه شده در نسخهی 3.13.
- exception configparser.UnnamedSectionDisabledError¶
استثنایی که هنگام تلاش برای استفاده از
UNNAMED_SECTIONبدون فعالسازی آن پرتاب میشود.اضافه شده در نسخهی 3.14.
- exception configparser.InvalidWriteError¶
استثنایی که هنگامی پرتاب میشود که تلاش برای فراخوانی
ConfigParser.write()نتواند با یک فراخوانیConfigParser.read()در آینده بهطور دقیق تجزیه شود.مثال: نوشتن کلیدی که با الگوی
ConfigParser.SECTCREآغاز میشود، هنگام خواندن بهعنوان سرآیند بخش تجزیه میشود. تلاش برای نوشتن این مورد باعث پرتاب این استثنا میشود.اضافه شده در نسخهی 3.14.
پانویسها