بايثون ConfigParser مفاتيح فريدة من نوعها في القسم

StackOverflow https://stackoverflow.com/questions/287757

  •  08-07-2019
  •  | 
  •  

سؤال

قرأت جزء من مستندات ورأى أن ConfigParser بإرجاع قائمة أزواج مفتاح/قيمة الخيارات الموجودة داخل القسم.أنا أحسب أن مفاتيح لا تحتاج إلى أن تكون فريدة من نوعها داخل القسم ، وإلا محلل سيعود رسم الخرائط.أنا صممت لي config مخطط حول هذا الافتراض ، ثم للأسف أدركت أن هذا ليس هو الحال:

>>> from ConfigParser import ConfigParser
>>> from StringIO import StringIO
>>> fh = StringIO("""
... [Some Section]
... spam: eggs
... spam: ham
... """)
>>> parser = ConfigParser()
>>> parser.readfp(fh)
>>> print parser.items('Some Section')
[('spam', 'ham')]

ثم عدت وجدت جزء من مستندات أنني يجب أن قرأت:

أقسام عادة تخزينها في مدمج القاموس.بديل قاموس نوع يمكن أن تنتقل إلى ConfigParser منشئ.على سبيل المثال ، إذا قاموس نوع هو مر أن أنواع مفاتيح الأبواب سوف يكون فرز على الكتابة مرة أخرى ، كما سيكون مفاتيح داخل كل قسم.

للحفاظ على بلدي القائمة ملف التكوين مخطط (التي أنا حقا أحب الآن ;) أنا أفكر تمرير رسم الخرائط مثل كائن كما ذكر أعلاه التي تتراكم القيم بدلا من الهجوم عليها.هل هناك أبسط طريقة لمنع مفتاح/قيمة انهيار أنا في عداد المفقودين ؟ بدلا من جعل مجنون محول (التي يمكن أن كسر إذا ConfigParser's تنفيذ التغييرات) يجب أن تكتب البديل ConfigParser نفسها ؟

أشعر أن هذه قد تكون واحدة من تلك 'نعم' لحظات حيث أنا فقط رؤية الحلول الصعبة.

[تحرير:] هنا أدق مثال على كيفية كنت ترغب في استخدام نفس المفتاح عدة مرات:

[Ignored Paths]
ignore-extension: .swp
ignore-filename: tags
ignore-directory: bin

أنا لا بفواصل-قائمة الجملة لأنه من الصعب على العيون عند نطاق واسع إلى كثير من القيم ؛ على سبيل المثال ، بفواصل قائمة من خمسين امتداد لن تكون خاصة للقراءة.

هل كانت مفيدة؟

المحلول

ConfigParser ليست مصممة للتعامل مع مثل هذه الظروف.وعلاوة على ذلك, ملف config لا معنى له بالنسبة لي.

ConfigParser يعطيك dict-مثل هيكل لكل قسم ، لذلك عند استدعاء محلل.البنود(القسم), أنا أتوقع مماثلة الإخراج إلى dict.البنود () الذي هو مجرد قائمة من مفتاح/قيمة الصفوف.وأود أن لا نتوقع أن نرى شيئا مثل:

[('spam', 'eggs'), ('spam', 'ham')]

ناهيك عن كيف تتوقع التالية تتصرف؟:

parser.get('Some Section', 'spam')

وهو المقصود طريقة لاسترداد القيم.

إذا كنت ترغب في تخزين قيم متعددة على نفس المفتاح ، أود أن أقترح شيئا مثل هذا في ملف config الخاص بك:

[Some Section]
spam: eggs, ham

و هذا في التعليمات البرمجية:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')]

بالطبع هذا سوف تعمل فقط من أجل القيم التي لا تحتوي على فواصل أنفسهم أو التعامل مع اقتباس.لذلك, يجب أن توظف تقنية أكثر تقدما (انظر هذا و هذا).

تحرير:إذا كنت لا تمانع إضافية التبعية ، يمكن التحقق من ConfigObj, الذي يدعم أصلا قوائم نوع قيمة.

نصائح أخرى

هذا النقص من ConfigParser هو السبب pyglet المستخدمة نسخة مصححة من epydoc استبدال ConfigParser ini مع هذا شكل بسيط:

name: pyglet
url: http://www.pyglet.org/

output: html
target: doc/api/
...    
module: pyglet

exclude: pyglet.gl.gl
exclude: pyglet.gl.agl
exclude: pyglet.gl.lib_agl
exclude: pyglet.gl.wgl
...

إذا كنت لا تحتاج إلى أقسام هذا النهج يمكن أن تكون مفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top