কনফিগার পার্সারে তালিকাভুক্ত


180

সাধারণ কনফিগার পার্সার উত্পন্ন ফাইলটি দেখে মনে হচ্ছে:

[Section]
bar=foo
[Section 2]
bar2= baz

উদাহরণস্বরূপ, এখন সূচকের তালিকার কোনও উপায় আছে:

[Section 3]
barList={
    item1,
    item2
}

সম্পর্কিত প্রশ্ন: পাইথনের কনফিগারেশন পার্সার প্রতি বিভাগে অনন্য কী

উত্তর:


141

তালিকাটি একটি সীমানাযুক্ত স্ট্রিংয়ে প্যাক করা এবং কনফিগার থেকে স্ট্রিংটি একবার আনপ্যাকিং করা থেকে বিরত থাকার কিছু নেই। আপনি যদি এভাবে এটি করেন তবে আপনার কনফিগার বিভাগটি দেখতে পাবেন:

[Section 3]
barList=item1,item2

এটি সুন্দর নয় তবে এটি বেশিরভাগ সহজ তালিকার জন্য কার্যকর।


2
এবং যদি আপনার কাছে জটিল তালিকা পাওয়া যায়, আপনি এই প্রশ্নটি উল্লেখ করতে পারেন: stackoverflow.com/questions/330900/… :-)
জন ফুহি

চমৎকার সমাধান, তবে কোনও গ্যারান্টি দেওয়া সম্ভব ডেলিমিটার না থাকলে এটি কীভাবে করবেন তা কোনও তালিকার আইটেমের ভিতরে উপস্থিত হবে না ???
উইম

@ উইম আমার উত্তর দেখুন, আপনি im n ডিলিমিটার হিসাবে ব্যবহার করতে পারেন
পিটার স্মিটে

@ উইম আপনার যদি ডিলিমিটার চরিত্রটি আইনী চরিত্র হতে পারে তবে পালানোর কোনও উপায় কার্যকর করতে হবে। (এবং একটি উপায় যাই হোক না কেন চরিত্র আপনি পলায়নের জন্য ব্যবহার অব্যাহতি।)
jamesdlin

যদি একটি তালিকার একটি উপাদান থাকে?
সেরজিও মাফরা

222

এছাড়াও কিছুটা দেরি হলেও কারওর জন্য সহায়ক হতে পারে। আমি কনফিগার পার্সার এবং জেএসওনের সংমিশ্রণটি ব্যবহার করছি:

[Foo]
fibs: [1,1,2,3,5,8,13]

শুধু এটি দিয়ে পড়ুন:

>>> json.loads(config.get("Foo","fibs"))
[1, 1, 2, 3, 5, 8, 13]

এমনকি যদি আপনার তালিকা দীর্ঘ হয় তবে লাইনগুলিও ভাঙ্গতে পারেন (ধন্যবাদ @ পিটার-স্মিট):

[Bar]
files_to_check = [
     "/path/to/file1",
     "/path/to/file2",
     "/path/to/another file with space in the name"
     ]

অবশ্যই আমি কেবল JSON ব্যবহার করতে পারি, তবে কনফিগার ফাইলগুলি আরও বেশি পঠনযোগ্য এবং [ডিফল্ট] বিভাগটি খুব কার্যকর find


1
এটি দুর্দান্ত কারণ এটি স্বয়ংক্রিয়ভাবে "castালাই" মানগুলি করে যা আপনি আগে থেকে প্রকারগুলি না জানলে কার্যকর হতে পারে।
লেজিবিটি

আমি এই ধারণাটি পছন্দ করি তবে আমি এটি কেবল সংখ্যার তালিকার সাথে কাজ করতে পারি। উদ্ধৃতি চিহ্নগুলি সাহায্য করে না। রহস্যময়। সরানো.
আরএসউ

5
তাদের কাজ করার জন্য স্ট্রিংগুলির জন্য আপনার কাছে ["a", "b", "c"] থাকতে হবে। আমার জন্য, সংখ্যার জন্য এই ক্লিকগুলি তবে সিএফজি ফাইলগুলি বেশিরভাগই সম্পাদনাযোগ্য - প্রতি "" যোগ করা ব্যথা। আমি বরং কমা ব্যবহার করব এবং তারপরে এটি বিভক্ত করব।
সৌরভ হিরানী

কেবলমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে একটি মার্জিত সমাধান। মন্তব্য এবং জসন ব্যবহার করতে সক্ষম হওয়ায় ভাল লাগছে।
wi1

এটি কীভাবে কাঁচা স্ট্রিংয়ের জন্য কাজ করবে key5 : [r"abc $x_i$", r"def $y_j$"]? তারা ত্রুটি বাড়িয়েছেjson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
কিংসুইউ

100

এই পার্টিতে দেরি করে আসছে, তবে আমি সম্প্রতি একটি তালিকার জন্য একটি কনফিগার ফাইলে একটি নিবেদিত বিভাগের সাথে এটি প্রয়োগ করেছি:

[paths]
path1           = /some/path/
path2           = /another/path/
...

এবং config.items( "paths" )পাথ আইটেমগুলির পুনরাবৃত্তিযোগ্য তালিকা পেতে ব্যবহার করে :

path_items = config.items( "paths" )
for key, path in path_items:
    #do something with path

আশা করি এটি অন্যান্য লোকদের এই প্রশ্নটি গুগল করতে সহায়তা করে;)


3
আমি এই সমাধানটি পছন্দ করি, কারণ আপনি ; commentসম্পূর্ণ তালিকাটি পুনরায় লিখিত না করে তালিকা থেকে নির্দিষ্ট আইটেমগুলি আউট করতে পারেন ।
wim

1
+1, তবে আপনি যদি এটি করেন তবে কেবল ব্যবহারের ক্ষেত্রে সতর্কতা অবলম্বন করুন key, কারণ কনফিগারেশন পার্সার যেমন সমস্ত কীগুলি লোয়ার-কেসে রূপান্তর করে
অ্যালেক্স ডিন

4
@ অ্যালেক্সডিয়ান আপনি বিকল্পফর্ম = আরআর সেট করে উটকেসকে জায়গায় রেখে কনফিগার পার্সার সেটআপ করতে পারেন। উদাহরণ: config = ConfigParser.SafeConfigParser() config.optionxform = str তাহলে
কেসটি

@ হেনরি কুক আপনি কি পরীক্ষা করেছেন যে কোনও কীটি একাধিকবার তালিকাভুক্ত করা হয়?
দেবপ্লেয়ার

1
@ ডেভপ্লেয়ার মাল্টি-কী ব্যবহারের সাথে আপনি কেবল সর্বশেষ মান পাবেন। (অন্যান্য পাঠকদের সুবিধার জন্য 2 বছরের পুরানো মন্তব্যের প্রতিক্রিয়া)
মার্সিন কে

62

একটি জিনিস যা অনেক লোক জানে না তা হ'ল বহু-লাইন কনফিগারেশন-মান অনুমোদিত। উদাহরণ স্বরূপ:

;test.ini
[hello]
barlist = 
    item1
    item2

এর মান config.get('hello','barlist')এখন হবে:

"\nitem1\nitem2"

যা আপনি সহজেই স্প্লিটলাইন পদ্ধতিতে বিভক্ত করতে পারেন (খালি আইটেমগুলি ফিল্টার করতে ভুলবেন না)।

যদি আমরা পিরামিডের মতো কোনও বড় কাঠামোর দিকে তাকাই তবে তারা এই কৌশলটি ব্যবহার করছে:

def aslist_cronly(value):
    if isinstance(value, string_types):
        value = filter(None, [x.strip() for x in value.splitlines()])
    return list(value)

def aslist(value, flatten=True):
    """ Return a list of strings, separating the input based on newlines
    and, if flatten=True (the default), also split on spaces within
    each line."""
    values = aslist_cronly(value)
    if not flatten:
        return values
    result = []
    for value in values:
        subvalues = value.split()
        result.extend(subvalues)
    return result

উৎস

নিজেই, যদি আপনার কাছে এটি সাধারণ জিনিস হয় তবে আমি সম্ভবত কনফিগার পার্সারটি বাড়িয়ে দেব:

class MyConfigParser(ConfigParser):
    def getlist(self,section,option):
        value = self.get(section,option)
        return list(filter(None, (x.strip() for x in value.splitlines())))

    def getlistint(self,section,option):
        return [int(x) for x in self.getlist(section,option)]

মনে রাখবেন যে এই কৌশলটি ব্যবহার করার সময় কয়েকটি বিষয় লক্ষ্য করা উচিত

  1. নতুন রেখাগুলি যা আইটেমগুলি শ্বেত স্পেস দিয়ে শুরু করা উচিত (যেমন একটি স্থান বা একটি ট্যাব)
  2. হোয়াইটস্পেস দিয়ে শুরু হওয়া নিম্নলিখিত সমস্ত লাইনগুলি পূর্ববর্তী আইটেমের অংশ হিসাবে বিবেচিত হয়। এছাড়াও যদি এটিতে একটি = চিহ্ন থাকে বা এটি একটি দিয়ে শুরু হয়; সাদা স্থান অনুসরণ করুন।

আপনি .splitlines()পরিবর্তে ব্যবহার করবেন না কেন .split()? প্রত্যেকের ডিফল্ট আচরণ ব্যবহার করে বিভাজন পরিষ্কারভাবে উচ্চতর হয় (ফাঁকা লাইনগুলি ফিল্টার করে)। যদি আমি কিছু মিস না করি ...
আরএসএস

7
.split () সমস্ত সাদা স্পেসে বিরতি দেয় (নির্দিষ্ট অক্ষর না দেওয়া হয়), .স্প্লিটলাইনস () সমস্ত নতুনলাইন অক্ষরগুলিতে বিরতি দেয়।
পিটার স্মিট

আহ আহ ভাল পয়েন্ট। আমার কোনও মানেরই স্থান ফাঁকা হওয়ায় আমি এটি সম্পর্কে ভাবিনি।
আরএসউ

38

আপনি যদি একটি তালিকায় আক্ষরিক অর্থে পাস করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

ast.literal_eval()

উদাহরণস্বরূপ কনফিগারেশন:

[section]
option=["item1","item2","item3"]

কোডটি হ'ল:

import ConfigParser
import ast

my_list = ast.literal_eval(config.get("section", "option"))
print(type(my_list))
print(my_list)

আউটপুট:

<type'list'>
["item1","item2","item3"]

এই ক্ষেত্রে, ব্যবহার ast.literal_eval()করার তুলনায় (যুক্তিযুক্ত আরও বেশি জনপ্রিয়) json.loads()কী সুবিধা হবে? আমার মনে হয় উত্তরোত্তর আরও সুরক্ষা দেয়, না?
রায়লুও

2
আমি এটি দেখতে এবং এর উদাহরণটি দেখতে চাই, এই থ্রেডটিতে একটি উত্তর যুক্ত করতে নির্দ্বিধায় যদি আপনি মনে করেন এটি সাহায্য করবে যদিও আপনার মন্তব্য নিজেই একটি ভাল প্রশ্ন তৈরি করবে। আমি যে উত্তরটি দিয়েছি তা কনফিগার পার্সার থেকে তালিকাগুলি ব্যবহার সহজতর করে তাই অ্যাপের অভ্যন্তরীণভাবে রেজিক্স ব্যবহারের প্রতিক্রিয়া সরিয়ে ফেলা হয়। প্রসঙ্গ ছাড়াই আমি এর "সিকিউরিটি" মান সম্পর্কে মন্তব্য করতে পারি না।
পাইথন টেস্টার

আমি আক্ষরিক_আভালটি ব্যবহার করে সতর্কতা অবলম্বন করব যা = বা তার পরে পাইথন স্ট্রিংয়ের প্রত্যাশা করে: অতএব আপনি আর ব্যবহার করতে পারবেন না যেমন पथ 1 = / কিছু / পথ / তবে পথ 1 = '/ কিছু / পথ /'
vldbnc

21

এই উত্তরগুলির convertersকোনওর জন্য কাওয়ার্গেরConfigParser() কোনও উল্লেখই হতাশার মতো নয়।

ডকুমেন্টেশন অনুসারে আপনি এতে একটি অভিধান পাস করতে পারেন যা পার্সার এবং বিভাগের প্রক্সি উভয়ের জন্য ConfigParserএকটি getপদ্ধতি যুক্ত করবে । সুতরাং একটি তালিকার জন্য:

example.ini

[Germ]
germs: a,list,of,names, and,1,2, 3,numbers

পার্সার উদাহরণ:

cp = ConfigParser(converters={'list': lambda x: [i.strip() for i in x.split(',')]})
cp.read('example.ini')
cp.getlist('Germ', 'germs')
['a', 'list', 'of', 'names', 'and', '1', '2', '3', 'numbers']
cp['Germ'].getlist('germs')
['a', 'list', 'of', 'names', 'and', '1', '2', '3', 'numbers']

এটি আমার ব্যক্তিগত পছন্দের কারণ কোনও সাবক্লাসিংয়ের প্রয়োজন নেই এবং জেএসএন বা ব্যাখ্যা দ্বারা ব্যাখ্যা করা যেতে পারে এমন একটি তালিকা পুরোপুরি লিখতে আমার কোনও শেষ ব্যবহারকারীকে নির্ভর করতে হবে না ast.literal_eval


15

আমি এটি গ্রাস করার জন্য এখানে অবতরণ করেছি ...

[global]
spys = richard.sorge@cccp.gov, mata.hari@deutschland.gov

উত্তরটি হ'ল এটি কমাতে বিভক্ত করা এবং স্পেসগুলি ফেলা:

SPYS = [e.strip() for e in parser.get('global', 'spys').split(',')]

একটি তালিকা ফলাফল পেতে:

['richard.sorge@cccp.gov', 'mata.hari@deutschland.gov']

এটি ওপি-র প্রশ্নের সঠিক উত্তর নাও দিতে পারে তবে কিছু লোক সন্ধান করছেন এমন সহজ উত্তর হতে পারে।


2
আমি ভেবেছিলাম ডিক ছিল sorger@espionage.su! আমার মেলটি বাড়াতে অবাক! >: _ <
অগাস্টা

1
4 বছর পরে এই মন্তব্যটি পড়ছেন এবং ইস্টার ডিমের কাছে হাঁসফাঁস করছেন
এক কৌতূহল প্রকৌশলী

11

আমি তালিকার জন্য এটি ব্যবহার করি:

কনফিগার ফাইল সামগ্রী:

[sect]
alist = a
        b
        c

কোড:

l = config.get('sect', 'alist').split('\n')

এটি স্ট্রিং জন্য কাজ করে

সংখ্যার ক্ষেত্রে

কনফিগার সামগ্রী:

nlist = 1
        2
        3

কোড:

nl = config.get('sect', 'alist').split('\n')
l = [int(nl) for x in nl]

ধন্যবাদ।


এই এক যে আমি আসলে ধন্যবাদ @LittleEaster খুঁজছেন ছিল হয়
অ্যাশলে

5

সুতরাং অন্য একটি উপায়, যা আমি পছন্দ করি তা হ'ল মানগুলি বিভক্ত করা, উদাহরণস্বরূপ:

#/path/to/config.cfg
[Numbers]
first_row = 1,2,4,8,12,24,36,48

নীচে স্ট্রিং বা পূর্ণসংখ্যার তালিকায় এর মতো লোড করা যেতে পারে:

import configparser

config = configparser.ConfigParser()
config.read('/path/to/config.cfg')

# Load into a list of strings
first_row_strings = config.get('Numbers', 'first_row').split(',')

# Load into a list of integers
first_row_integers = [int(x) for x in config.get('Numbers', 'first_row').split(',')]

এই পদ্ধতিটি আপনাকে JSON হিসাবে লোড করতে আপনার মানটিকে বন্ধনীতে মোড়ানো প্রয়োজন থেকে বিরত রাখে।


হাই মিচ, পরের ক্ষেত্রে get_int ('first_row') ব্যবহার করতে ভাল লাগত না? স্পষ্টভাবে (',') এটি লুপিংয়ের সময় স্পষ্টতভাবে ইন্টার-তে রূপান্তরিত করার পরিবর্তে?
গাইডো

2

কনফিগার পার্সার দ্বারা সিরিয়ালাইজেশনের জন্য কেবল প্রাথমিক প্রকারগুলিই সমর্থিত। আমি সেই ধরণের প্রয়োজনের জন্য JSON বা YAML ব্যবহার করব।


স্পষ্টতার জন্য ধন্যবাদ, উক্কু। একমাত্র সমস্যা হ'ল আমি এই মুহুর্তে বাহ্যিক প্যাকেজগুলি ব্যবহার করতে পারি না। আমি মনে করি আমি এটি হ্যান্ডেল করার জন্য একটি সাধারণ ক্লাস লিখব। আমি অবশেষে ভাগ করব।
পিস্তাকিও

আপনি পাইথনের কোন সংস্করণটি চালাচ্ছেন? JSON মডিউলটি ২.6 সহ অন্তর্ভুক্ত রয়েছে।
প্যাট্রিক হ্যারিংটন 0

2

অতীতেও আমি একই সমস্যার মুখোমুখি হয়েছি। আপনার যদি আরও জটিল তালিকার প্রয়োজন হয় তবে কনফিগার পার্সার থেকে উত্তরাধিকার সূত্রে নিজের পার্সার তৈরি বিবেচনা করুন। তারপরে আপনি তার সাথে get পদ্ধতিটি ওভাররাইট করে দিতে পারেন:

    def get(self, section, option):
    """ Get a parameter
    if the returning value is a list, convert string value to a python list"""
    value = SafeConfigParser.get(self, section, option)
    if (value[0] == "[") and (value[-1] == "]"):
        return eval(value)
    else:
        return value

এই সমাধানের সাহায্যে আপনি আপনার কনফিগার ফাইলটিতে অভিধান সংজ্ঞায়িত করতে সক্ষম হবেন।

কিন্তু সতর্কতা অবলম্বন করা আবশ্যক! এটি ততটা নিরাপদ নয়: এর অর্থ হল যে কেউ আপনার কনফিগারেশনের মাধ্যমে কোড চালাতে পারে। আপনার প্রকল্পে সুরক্ষা যদি সমস্যা না হয় তবে আমি সরাসরি পাইথন ক্লাসগুলি কনফিগার ফাইল হিসাবে ব্যবহার করার বিষয়টি বিবেচনা করব। নিম্নলিখিতটি একটি কনফিগার পার্সার ফাইলের চেয়ে অনেক বেশি শক্তিশালী এবং ব্যয়যোগ্য:

class Section
    bar = foo
class Section2
    bar2 = baz
class Section3
    barList=[ item1, item2 ]

তবে আমি এটি করার কথা ভাবছিলাম: কেন কনফিগার মানগুলি সেট আপ না করে barList=item1,item2কল করে if value.find(',') > 0: return value.split(','), বা আরও ভাল, অ্যাপ্লিকেশনটিতে সমস্ত কনফিগার বিকল্পগুলি তালিকা হিসাবে এবং কেবল .split(',')সবকিছু অন্ধভাবে পার্স করা আছে ?
Droogans

1
import ConfigParser
import os

class Parser(object):
    """attributes may need additional manipulation"""
    def __init__(self, section):
        """section to retun all options on, formatted as an object
        transforms all comma-delimited options to lists
        comma-delimited lists with colons are transformed to dicts
        dicts will have values expressed as lists, no matter the length
        """
        c = ConfigParser.RawConfigParser()
        c.read(os.path.join(os.path.dirname(__file__), 'config.cfg'))

        self.section_name = section

        self.__dict__.update({k:v for k, v in c.items(section)})

        #transform all ',' into lists, all ':' into dicts
        for key, value in self.__dict__.items():
            if value.find(':') > 0:
                #dict
                vals = value.split(',')
                dicts = [{k:v} for k, v in [d.split(':') for d in vals]]
                merged = {}
                for d in dicts:
                    for k, v in d.items():
                        merged.setdefault(k, []).append(v)
                self.__dict__[key] = merged
            elif value.find(',') > 0:
                #list
                self.__dict__[key] = value.split(',')

সুতরাং এখন আমার config.cfgফাইল, যা দেখতে এটি দেখতে পারে:

[server]
credentials=username:admin,password:$3<r3t
loggingdirs=/tmp/logs,~/logs,/var/lib/www/logs
timeoutwait=15

আমার ছোট প্রকল্পের জন্য সূক্ষ্ম-দানাদার-পর্যাপ্ত বস্তুগুলিতে পার্স করা যায়।

>>> import config
>>> my_server = config.Parser('server')
>>> my_server.credentials
{'username': ['admin'], 'password', ['$3<r3t']}
>>> my_server.loggingdirs:
['/tmp/logs', '~/logs', '/var/lib/www/logs']
>>> my_server.timeoutwait
'15'

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


1

আমি আমার প্রকল্পে অনুরূপ টাস্কটি মূল্য ছাড়াই কী সহ বিভাগ সহ সম্পন্ন করেছি:

import configparser

# allow_no_value param says that no value keys are ok
config = configparser.ConfigParser(allow_no_value=True)

# overwrite optionxform method for overriding default behaviour (I didn't want lowercased keys)
config.optionxform = lambda optionstr: optionstr

config.read('./app.config')

features = list(config['FEATURES'].keys())

print(features)

আউটপুট:

['BIOtag', 'TextPosition', 'IsNoun', 'IsNomn']

app.config:

[FEATURES]
BIOtag
TextPosition
IsNoun
IsNomn

0

json.loads& ast.literal_evalমনে হচ্ছে এটি কাজ করছে তবে কনফিগারেশনের মধ্যে সাধারণ তালিকাটি প্রতিটি অক্ষরকে বাইট হিসাবে বিবেচনা করছে তাই এমনকি বর্গাকার বন্ধনীটি ফেরত ....

মানে কনফিগারেশন থাকলে fieldvalue = [1,2,3,4,5]

তারপর জায়গায় config.read(*.cfg) config['fieldValue'][0]ফিরে[1


0

পিটার স্মিটে উল্লিখিত হিসাবে ( https://stackoverflow.com/a/11866695/7424596 ) আপনি কনফিগার পার্সার প্রসারিত করতে চাইতে পারেন, উপরন্তু, একটি ইন্টারপোলেটর তালিকাতে এবং তালিকা থেকে স্বয়ংক্রিয়ভাবে রূপান্তর করতে ব্যবহার করা যেতে পারে।

নীচে রেফারেন্সের জন্য আপনি এমন কোড খুঁজে পেতে পারেন যা স্বয়ংক্রিয়ভাবে কনফিগারকে রূপান্তর করে:

[DEFAULT]
keys = [
    Overall cost structure, Capacity, RAW MATERIALS,
    BY-PRODUCT CREDITS, UTILITIES, PLANT GATE COST,
    PROCESS DESCRIPTION, AT 50% CAPACITY, PRODUCTION COSTS,
    INVESTMENT, US$ MILLION, PRODUCTION COSTS, US ¢/LB,
    VARIABLE COSTS, PRODUCTION COSTS, MAINTENANCE MATERIALS
  ]

সুতরাং আপনি কীগুলি অনুরোধ করলে আপনি পাবেন:

<class 'list'>: ['Overall cost structure', 'Capacity', 'RAW MATERIALS', 'BY-PRODUCT CREDITS', 'UTILITIES', 'PLANT GATE COST', 'PROCESS DESCRIPTION', 'AT 50% CAPACITY', 'PRODUCTION COSTS', 'INVESTMENT', 'US$ MILLION', 'PRODUCTION COSTS', 'US ¢/LB', 'VARIABLE COSTS', 'PRODUCTION COSTS', 'MAINTENANCE MATERIALS']

কোড:

class AdvancedInterpolator(Interpolation):
    def before_get(self, parser, section, option, value, defaults):
        is_list = re.search(parser.LIST_MATCHER, value)
        if is_list:
            return parser.getlist(section, option, raw=True)
        return value


class AdvancedConfigParser(ConfigParser):

    _DEFAULT_INTERPOLATION = AdvancedInterpolator()

    LIST_SPLITTER = '\s*,\s*'
    LIST_MATCHER = '^\[([\s\S]*)\]$'

    def _to_list(self, str):
        is_list = re.search(self.LIST_MATCHER, str)
        if is_list:
            return re.split(self.LIST_SPLITTER, is_list.group(1))
        else:
            return re.split(self.LIST_SPLITTER, str)


    def getlist(self, section, option, conv=lambda x:x.strip(), *, raw=False, vars=None,
                  fallback=_UNSET, **kwargs):
        return self._get_conv(
                section, option,
                lambda value: [conv(x) for x in self._to_list(value)],
                raw=raw,
                vars=vars,
                fallback=fallback,
                **kwargs
        )

    def getlistint(self, section, option, *, raw=False, vars=None,
            fallback=_UNSET, **kwargs):
        return self.getlist(section, option, int, raw=raw, vars=vars,
                fallback=fallback, **kwargs)

    def getlistfloat(self, section, option, *, raw=False, vars=None,
            fallback=_UNSET, **kwargs):
        return self.getlist(section, option, float, raw=raw, vars=vars,
                fallback=fallback, **kwargs)

    def getlistboolean(self, section, option, *, raw=False, vars=None,
            fallback=_UNSET, **kwargs):
        return self.getlist(section, option, self._convert_to_boolean,
                raw=raw, vars=vars, fallback=fallback, **kwargs)

পিএস ইনডেন্টেশন গুরুত্ব মনে রাখবেন। কনফিগার পার্সার ডক স্ট্রিংয়ে যেমন পড়ে:

মানগুলি একাধিক রেখাকে বিস্তৃত করতে পারে, যতক্ষণ না এগুলি মানের প্রথম লাইনের চেয়ে গভীর থাকে। পার্সার মোডের উপর নির্ভর করে, ফাঁকা রেখাগুলি মাল্টলাইন মানগুলির অংশ হিসাবে বিবেচিত হবে বা উপেক্ষা করা হবে।

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