কনফিগার পার্সারে কেস সংরক্ষণ করবেন?


90

আমি সেটিংস সংরক্ষণ করতে পাইথনের কনফিগারেশন পার্সার মডিউলটি ব্যবহার করার চেষ্টা করেছি । আমার অ্যাপ্লিকেশনটির জন্য এটি গুরুত্বপূর্ণ যে আমি আমার বিভাগগুলিতে প্রতিটি নামের কেস সংরক্ষণ করি। দস্তাবেজগুলি উল্লেখ করেছে যে কনফিগারপার্স.অপশনেক্সফর্ম () এ স্ট্রিম () পাস করা এটি সম্পাদন করবে তবে এটি আমার পক্ষে কার্যকর হয় না। নামগুলি সব ছোট ছোট are আমি কিছু অনুপস্থিত করছি?

<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz

পাই কি পাইথন সিউডোকোড:

import ConfigParser,os

def get_config():
   config = ConfigParser.ConfigParser()
   config.optionxform(str())
    try:
        config.read(os.path.expanduser('~/.myrc'))
        return config
    except Exception, e:
        log.error(e)

c = get_config()  
print c.options('rules')
[('monkey', 'foo'), ('ferret', 'baz')]

উত্তর:


114

ডকুমেন্টেশন গুলিয়ে ফেলছে। তাদের অর্থ কী:

import ConfigParser, os
def get_config():
    config = ConfigParser.ConfigParser()
    config.optionxform=str
    try:
        config.read(os.path.expanduser('~/.myrc'))
        return config
    except Exception, e:
        log.error(e)

c = get_config()  
print c.options('rules')

অর্থাত, কল করার পরিবর্তে ওভাররাইড অপশনক্সফর্ম; ওভাররাইডিং একটি সাবক্লাস বা উদাহরণে করা যেতে পারে। ওভাররাইড করার সময়, এটি কোনও ফাংশনে সেট করুন (কোনও ফাংশন কল করার ফলাফলের চেয়ে)।

আমি এখন এটি বাগ হিসাবে রিপোর্ট করেছি এবং এটি ঠিক হয়ে গেছে।


ধন্যবাদ. এটি কার্যকর হয় এবং আমি সম্মত হই যে ডক্সগুলি বিভ্রান্ত করছে।
পোজো

39

আমার জন্য অবজেক্টটি তৈরি করার সাথে সাথে অপশনক্সফর্ম সেট করার কাজ করেছিল

config = ConfigParser.RawConfigParser()
config.optionxform = str 

4
দুর্দান্ত কাজ! (নোট পাইথন 3 এটা যে "configparser" শ্রেণী নাম (সময় বড় হরফের)
নোয়াম Manos

4
@ নোমমনোস: আপনি মডিউলটির নাম উল্লেখ করছেন (ক্লাসের নামটি এখনও কনফিগার পার্সার )।
জোনাস বাইস্টর্ম

4
নোট করুন যে এটির সাথেও খুব কার্যকর হয়ConfigParser.ConfigParser()
জিন-ফ্রাঙ্কোয়েস টি।

প্রকৃতপক্ষে. এটা কাজ করে। এই প্যারামিটারটি মূলত RawConfigParser () এর সাথে সম্পর্কিত নয় বলে উল্লেখ করা ভাল, যেহেতু এটি কনফিগারপার্সার () শ্রেণীর সাথেও সমর্থন করে। ধন্যবাদ মানুষ.
ivanleoncz

7

আপনার কোড যুক্ত করুন:

config.optionxform = lambda option: option  # preserve case for letters

4
এটি আমার পক্ষে কমপক্ষে অজগর ২.7-এ কাজ করে বলে মনে হয় এবং এটি গৃহীত উত্তরের চেয়ে অনেক পরিষ্কার। ধন্যবাদ ফু!
hrbdg

4
এটি শীর্ষ স্কোর করা উত্তরের মতোই - লাইনটি দেখুন config.optionxform=str:) আপনার ল্যামডবা এর পরিবর্তে @ মার্টিন বনাম লুইস এম্বেড করা strফাংশনটি ব্যবহার করেছেন
xuthus

@ এক্সুথাস - আসলে আপনি 1 লাইনের পরিবর্তে 11 টি কোড লাইন ব্যবহার করতে পারেন। আপনার ইচ্ছা.
FooBar167

4

আমি জানি যে এই প্রশ্নের উত্তর দেওয়া হয়েছে, তবে আমি ভেবেছিলাম কিছু লোক এই সমাধানটি দরকারী বলে মনে করতে পারেন। এটি এমন একটি শ্রেণী যা সহজেই বিদ্যমান কনফিগার পার্সার ক্লাসটি প্রতিস্থাপন করতে পারে।

@ ওজমিস্টারের পরামর্শ অন্তর্ভুক্ত করতে সম্পাদিত:

class CaseConfigParser(ConfigParser):
    def optionxform(self, optionstr):
        return optionstr

ব্যবহার সাধারণ কনফিগার পার্সারের সমান।

parser = CaseConfigParser()
parser.read(something)

এটি তাই আপনি প্রতিবার নতুন তৈরির সময় অপশনক্সফর্ম সেট করা থেকে বিরত থাকবেন ConfigParser, যা একরকম ক্লান্তিকর।


যেহেতু optionxformকেবলমাত্র একটি পদ্ধতি RawConfigParser, আপনি যদি নিজের সাবক্লাসটি তৈরি করতে যাচ্ছেন তবে আপনার ইনস্ট্যান্টেশন অনুসারে পুনরায় সংজ্ঞায়নের পরিবর্তে সাবক্লাসে পদ্ধতিটি ওভাররাইড করা উচিত:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
ওজেজমিস্টার

@ ওউজমিস্টার দুর্দান্ত ধারণা!
আইসড্রিটস

2

গুহাত:

আপনি যদি কনফিগার পার্সারের সাথে ডিফল্ট ব্যবহার করেন, যেমন:

config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})

এবং তারপরে এটি ব্যবহার করে পার্সার কেস-সংবেদনশীল করার চেষ্টা করুন:

config.optionxform = str

কনফিগারেশন ফাইল (গুলি) থেকে আপনার সমস্ত বিকল্প তাদের কেস রাখবে, তবে FOO_BAZলোয়ারকেসে রূপান্তরিত হবে।

খেলাপিদের ক্ষেত্রে তাদের ডিফল্ট রাখতে, সাবস্ক্লাসিং ব্যবহার করুন @ উত্তরাঞ্চলের উত্তরগুলিতে:

class CaseConfigParser(ConfigParser.SafeConfigParser):
    def optionxform(self, optionstr):
        return optionstr

config = CaseConfigParser({'FOO_BAZ': 'bar'})

এখন FOO_BAZএটি কেস রাখবে এবং আপনার ইন্টারপোলেশনমিসিংঅપ્শনআরর হবে না ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.