Config.py এ গ্লোবাল কনফিগারেশন ভেরিয়েবলগুলি সরবরাহ করার সর্বাধিক পাইথোনিক উপায়? [বন্ধ]


100

ওভার জটিল সহজ কাপড় আমার অবিরাম খোঁজা, আমি সবচেয়ে 'Pythonic' টিপিক্যাল 'ভিতরে বিশ্বব্যাপী কনফিগারেশন ভেরিয়েবল প্রদান পথ গবেষণা করছি config.py ' পাইথন ডিম প্যাকেজ খুঁজে পাওয়া যায়নি।

Theতিহ্যবাহী উপায়ে (আহ, ভাল ওল ' # সংজ্ঞা !) নিম্নরূপ:

MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']

সুতরাং গ্লোবাল ভেরিয়েবলগুলি নিম্নলিখিত একটির মধ্যে আমদানি করা হয়:

from config import *
dbname = MYSQL_DATABASE
for table in MYSQL_DATABASE_TABLES:
    print table

বা:

import config
dbname = config.MYSQL_DATABASE
assert(isinstance(config.MYSQL_PORT, int))

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

class Struct(object):

    def __init__(self, *args):
        self.__header__ = str(args[0]) if args else None

    def __repr__(self):
        if self.__header__ is None:
             return super(Struct, self).__repr__()
        return self.__header__

    def next(self):
        """ Fake iteration functionality.
        """
        raise StopIteration

    def __iter__(self):
        """ Fake iteration functionality.
        We skip magic attribues and Structs, and return the rest.
        """
        ks = self.__dict__.keys()
        for k in ks:
            if not k.startswith('__') and not isinstance(k, Struct):
                yield getattr(self, k)

    def __len__(self):
        """ Don't count magic attributes or Structs.
        """
        ks = self.__dict__.keys()
        return len([k for k in ks if not k.startswith('__')\
                    and not isinstance(k, Struct)])

এবং একটি 'config.py' যা শ্রেণি আমদানি করে এবং নীচে পড়তে:

from _config import Struct as Section

mysql = Section("MySQL specific configuration")
mysql.user = 'root'
mysql.pass = 'secret'
mysql.host = 'localhost'
mysql.port = 3306
mysql.database = 'mydb'

mysql.tables = Section("Tables for 'mydb'")
mysql.tables.users = 'tb_users'
mysql.tables.groups =  'tb_groups'

এবং এইভাবে ব্যবহৃত হয়:

from sqlalchemy import MetaData, Table
import config as CONFIG

assert(isinstance(CONFIG.mysql.port, int))

mdata = MetaData(
    "mysql://%s:%s@%s:%d/%s" % (
         CONFIG.mysql.user,
         CONFIG.mysql.pass,
         CONFIG.mysql.host,
         CONFIG.mysql.port,
         CONFIG.mysql.database,
     )
)

tables = []
for name in CONFIG.mysql.tables:
    tables.append(Table(name, mdata, autoload=True))

যা প্যাকেজের অভ্যন্তরে বৈশ্বিক ভেরিয়েবলগুলি সংরক্ষণ এবং আনার আরও পঠনযোগ্য, অভিব্যক্তিপূর্ণ এবং নমনীয় উপায় বলে মনে হচ্ছে।

সবচেয়ে লম্বা ধারণা? এই পরিস্থিতিতে মোকাবিলা করার জন্য সেরা অনুশীলন কী? আপনার প্যাকেজের ভিতরে বৈশ্বিক নাম এবং ভেরিয়েবলগুলি সংরক্ষণ এবং আনার আপনার উপায় কী ?


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

4
প্রায়শই আমি একটি JSON কনফিগারেশন ফাইল লিখতে শেষ করি। এটি অজগর কাঠামোতে সহজেই পড়া যায় এবং একটি সরঞ্জাম দ্বারা এটি তৈরি করা যায়। মনে হয় এটি সবচেয়ে নমনীয়তা এবং একমাত্র ব্যয় এমন কিছু ধনুর্বন্ধনী যা ব্যবহারকারীর জন্য বিরক্তিকর হতে পারে। যদিও আমি কোনও ডিম কখনও লিখিনি। সম্ভবত এটি স্ট্যান্ডার্ড উপায়। সেক্ষেত্রে কেবল আমার উপরের মন্তব্যটি উপেক্ষা করুন।
এরিকবওয়ার্ক

4
আপনি "স্ব .__ ডিক __। কী ()" এর পরিবর্তে "বার্স (স্ব)" ব্যবহার করতে পারেন
কার্লিসন

4
পাইথনের একটি সেটিংস ফাইল ব্যবহার করে সবচেয়ে ভাল অনুশীলনটির সম্ভাব্য নকল কী? তারা উত্তর দেয় "অনেকগুলি উপায় সম্ভব এবং একটি বাইকশেড থ্রেড ইতিমধ্যে বিদ্যমান config
নিকানা রেকলাভিকস

আমি ব্যবহার করে শেষ করেছি python-box, এই উত্তরটি দেখুন
বিকশিত হয়েছে

উত্তর:


5

আমি এটা একবার করেছিলাম। শেষ পর্যন্ত আমি আমার সরলিকৃত বেসিকনফিগ.পিটি আমার প্রয়োজনের জন্য পর্যাপ্ত পেয়েছি । আপনার যদি প্রয়োজন হয় তবে রেফারেন্সের জন্য অন্যান্য বস্তুর সাথে আপনি কোনও নেমস্পেসে যেতে পারেন। আপনি আপনার কোড থেকে অতিরিক্ত ডিফল্ট পাস করতে পারেন। এটি একই কনফিগারেশন অবজেক্টে অ্যাট্রিবিউট এবং ম্যাপিং স্টাইল সিনট্যাক্সকেও মানচিত্র করে।


6
basicconfig.pyফাইল উল্লেখ সরানো হয়েছে বলে মনে হয় করার github.com/kdart/pycopia/blob/master/core/pycopia/...
পল এম Furley

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

@ জিনক্স এই মুহুর্তে কনফিগারেশনের জন্য আমি একটি ওয়াইএএমএল ফাইল এবং পাইওয়ামএল ব্যবহার করব (এবং বর্তমানে ব্যবহার করছি)। আমি তৃতীয় পক্ষের নামে পরিচিত একটি মডিউলও ব্যবহার করি confitএবং এটি একাধিক উত্সকে মার্জ করা সমর্থন করে। এটি একটি নতুন ডেভিয়েস্টকনফিগ মডিউলের অংশ ।
কিথ

57

এই জাতীয় বিল্ট-ইন টাইপগুলি কীভাবে ব্যবহার করা যায় তা সম্পর্কে:

config = {
    "mysql": {
        "user": "root",
        "pass": "secret",
        "tables": {
            "users": "tb_users"
        }
        # etc
    }
}

আপনি নিম্নলিখিত হিসাবে মানগুলি অ্যাক্সেস করতে চাই:

config["mysql"]["tables"]["users"]

আপনি যদি আপনার কনফিগার গাছের অভ্যন্তরে অভিব্যক্তি গণনা করার সম্ভাবনা ত্যাগ করতে ইচ্ছুক হন তবে আপনি YAML ব্যবহার করতে পারেন এবং এর মতো আরও পাঠযোগ্য কনফিগারেশন ফাইলটি শেষ করতে পারেন:

mysql:
  - user: root
  - pass: secret
  - tables:
    - users: tb_users

এবং কনফিগারেশনের ফাইলটি কনসেন্টেন্টলি পার্স করতে এবং অ্যাক্সেস করতে পাইওয়ামএল এর মতো একটি লাইব্রেরি ব্যবহার করুন


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

4
যদি মেমরিতে ডেটা রাখার জন্য কেবল কিছু উপস্থিত থাকে ^^
সিনেটিক

16

আমি ছোট অ্যাপ্লিকেশনগুলির জন্য এই সমাধানটি পছন্দ করি :

class App:
  __conf = {
    "username": "",
    "password": "",
    "MYSQL_PORT": 3306,
    "MYSQL_DATABASE": 'mydb',
    "MYSQL_DATABASE_TABLES": ['tb_users', 'tb_groups']
  }
  __setters = ["username", "password"]

  @staticmethod
  def config(name):
    return App.__conf[name]

  @staticmethod
  def set(name, value):
    if name in App.__setters:
      App.__conf[name] = value
    else:
      raise NameError("Name not accepted in set() method")

এবং তারপরে ব্যবহারটি হ'ল:

if __name__ == "__main__":
   # from config import App
   App.config("MYSQL_PORT")     # return 3306
   App.set("username", "hi")    # set new username value
   App.config("username")       # return "hi"
   App.set("MYSQL_PORT", "abc") # this raises NameError

.. আপনার এটি পছন্দ করা উচিত কারণ:

  • ক্লাস ভেরিয়েবল ব্যবহার করে (চারপাশে পাস করার কোনও জিনিস নেই / কোনও সিঙ্গলটন প্রয়োজন নেই),
  • এনক্যাপসুলেটেড বিল্ট-ইন প্রকারগুলি ব্যবহার করে এবং দেখে মনে হচ্ছে (যেমন) কোনও মেথড কল App,
  • স্বতন্ত্র কনফিগারেশন অপরিবর্তনীয়তা নিয়ন্ত্রণ করে , পরিবর্তনীয় গ্লোবাল সবচেয়ে খারাপ ধরনের গ্লোবাল
  • আপনার উত্স কোডে প্রচলিত এবং নামযুক্ত অ্যাক্সেস / পঠনযোগ্যতার প্রচার করে
  • একটি সাধারণ শ্রেণি তবে কাঠামোগত অ্যাক্সেস প্রয়োগ করে , একটি বিকল্প ব্যবহার করা হয় @propertyতবে এর জন্য আইটেম প্রতি আরও পরিবর্তনশীল হ্যান্ডলিং কোড প্রয়োজন এবং এটি অবজেক্ট ভিত্তিক।
  • নতুন কনফিগার আইটেম যুক্ত করতে এবং এর রূপান্তরতা সেট করতে সর্বনিম্ন পরিবর্তন প্রয়োজন

- এডিট-- : বড় অ্যাপ্লিকেশনগুলির জন্য, ওয়াইএএমএল (অর্থাত্ বৈশিষ্ট্যগুলি) ফাইলে মান সংরক্ষণ এবং অপরিবর্তনীয় ডেটা হিসাবে পড়া আরও ভাল পদ্ধতির (যেমন ব্লুব / ওহালের উত্তর )। ছোট অ্যাপ্লিকেশনগুলির জন্য, উপরের এই সমাধানটি সহজ।


9

কিভাবে ক্লাস ব্যবহার সম্পর্কে?

# config.py
class MYSQL:
    PORT = 3306
    DATABASE = 'mydb'
    DATABASE_TABLES = ['tb_users', 'tb_groups']

# main.py
from config import MYSQL

print(MYSQL.PORT) # 3306

8

ব্লাব এর উত্তর মত। কোড কমাতে আমি ল্যাম্বদা ফাংশন দিয়ে এগুলি তৈরি করার পরামর্শ দিচ্ছি। এটার মত:

User = lambda passwd, hair, name: {'password':passwd, 'hair':hair, 'name':name}

#Col      Username       Password      Hair Color  Real Name
config = {'st3v3' : User('password',   'blonde',   'Steve Booker'),
          'blubb' : User('12345678',   'black',    'Bubb Ohaal'),
          'suprM' : User('kryptonite', 'black',    'Clark Kent'),
          #...
         }
#...

config['st3v3']['password']  #> password
config['blubb']['hair']      #> black

যদিও আপনি ক্লাস বানাতে চাইতে পারেন এর মতো গন্ধ নেই।

অথবা, মার্কএম হিসাবে উল্লেখ করা হয়েছে, আপনি ব্যবহার করতে পারেন namedtuple

from collections import namedtuple
#...

User = namedtuple('User', ['password', 'hair', 'name']}

#Col      Username       Password      Hair Color  Real Name
config = {'st3v3' : User('password',   'blonde',   'Steve Booker'),
          'blubb' : User('12345678',   'black',    'Bubb Ohaal'),
          'suprM' : User('kryptonite', 'black',    'Clark Kent'),
          #...
         }
#...

config['st3v3'].password   #> passwd
config['blubb'].hair       #> black

4
passএটি একটি কীওয়ার্ড হওয়ায় একটি দুর্ভাগ্যজনক পরিবর্তনশীল নাম।
থমাস স্ক্রেটার

ওহ হ্যাঁ ... আমি এই বোবা উদাহরণটি একসাথে টেনেছি। আমি নামটি পরিবর্তন করব
Cory-G

এই ধরণের পদ্ধতির জন্য, আপনি mkDictল্যাম্বদার পরিবর্তে কোনও শ্রেণি বিবেচনা করতে পারেন । আমরা যদি আমাদের ক্লাসকে কল করি তবে Userআপনার "কনফিগারেশন" অভিধান কীগুলি এমন কিছু শুরু করা হবে {'st3v3': User('password','blonde','Steve Booker')}। যখন আপনার "ব্যবহারকারী" একটি হল userপরিবর্তনশীল, তাহলে আপনি তার সম্পত্তি হিসাবে অ্যাক্সেস করতে পারেন user.hair, ইত্যাদি
অ্যান্ড্রু পামার

আপনি এই শৈলী আপনার মত ব্যবহার করা নির্বাচন করতে পারেন তাহলে collections.namedtupleUser = namedtuple('User', 'passwd hair name'); config = {'st3v3': User('password', 'blonde', 'Steve Booker')}
মার্কএম

7

আমি যে হস্কির আইডিয়াটি ব্যবহার করি তা সম্পর্কে একটি ছোট পার্থক্য। 'গ্লোবালস' (বা আপনি যা পছন্দ করেন) নামে একটি ফাইল তৈরি করুন এবং তারপরে এতে একাধিক ক্লাস সংজ্ঞায়িত করুন:

#globals.py

class dbinfo :      # for database globals
    username = 'abcd'
    password = 'xyz'

class runtime :
    debug = False
    output = 'stdio'

তারপরে, আপনার কাছে দুটি কোড ফাইল রয়েছে c1.py এবং c2.py, উভয়ই শীর্ষে থাকতে পারে

import globals as gl

এখন সমস্ত কোড অ্যাক্সেস করতে এবং মানগুলি সেট করতে পারে:

gl.runtime.debug = False
print(gl.dbinfo.username)

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

এটিকে GL হিসাবে আমদানি করে আপনার এমন একাধিক ফাইল এবং ভেরিয়েবল থাকতে পারে যা আপনাকে কোড ফাইল, ফাংশন ইত্যাদিতে মানগুলি অ্যাক্সেস করতে এবং সেট করতে দেয় তবে নামস্থান সংঘর্ষের কোনও আশঙ্কা ছাড়াই।

এটিতে অন্যান্য পদ্ধতির কিছু চতুর ত্রুটি পরীক্ষা করার অভাব রয়েছে, তবে এটি সহজ এবং অনুসরণযোগ্য।


4
এটি একটি মডিউলটির নামকরণের ভুল ধারণা করা হয়েছে globals, কারণ এটি একটি অন্তর্নির্মিত ফাংশন যা বর্তমান বিশ্বব্যাপী সুযোগে প্রতিটি প্রতীক সহ একটি ডিক ফেরত দেয়। তদ্ব্যতীত, পিইপি 8 ক্লাসের জন্য ক্যামেলকেস (সংক্ষিপ্ত শব্দে সমস্ত মূলধন সহ) সুপারিশ করে (অর্থাত্ DBInfo) এবং তথাকথিত ধ্রুবকগুলির জন্য আন্ডারস্কোর সহ বড় হাতের (যেমন DEBUG)।
নুনো আন্দ্রে

4
মন্তব্যের জন্য @ নুনোআন্দ্রেকে ধন্যবাদ, যতক্ষণ না আমি এটি পড়ছিলাম আমি ভাবছিলাম যে এই উত্তরটি দিয়ে কিছু অদ্ভুত কিছু হয় globals, লেখকের নামটি পরিবর্তন করা উচিত
ওগ্লপ

এই পদ্ধতির আমার যেতে হয়। আমি তবে অনেকগুলি পন্থা দেখি যা লোকেরা "সেরা" বলে। আপনি এটি রূপে কনফিগার করে কিছু ত্রুটিগুলি বর্ণনা করতে পারেন?
যশ নাগ

5

আসুন সত্য কথা বলুন, আমাদের সম্ভবত পাইথন সফটওয়্যার ফাউন্ডেশন রক্ষণাবেক্ষণ গ্রন্থাগারটি ব্যবহার করা উচিত :

https://docs.python.org/3/library/configparser.html

কনফিগার উদাহরণ: (ini ফর্ম্যাট, তবে JSON উপলব্ধ)

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no

কোড উদাহরণ:

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('example.ini')
>>> config['DEFAULT']['Compression']
'yes'
>>> config['DEFAULT'].getboolean('MyCompression', fallback=True) # get_or_else

এটিকে বিশ্বব্যাপী-অ্যাক্সেসযোগ্য করে তোলা:

import configpaser
class App:
 __conf = None

 @staticmethod
 def config():
  if App.__conf is None:  # Read only once, lazy.
   App.__conf = configparser.ConfigParser()
   App.__conf.read('example.ini')
  return App.__conf

if __name__ == '__main__':
 App.config()['DEFAULT']['MYSQL_PORT']
 # or, better:
 App.config().get(section='DEFAULT', option='MYSQL_PORT', fallback=3306)
 ....

ডাউনসাইডস:

  • অনিয়ন্ত্রিত বৈশ্বিক পরিবর্তনীয় রাষ্ট্র।

কনফিগারেশন পরিবর্তন করার জন্য আপনার অন্যান্য ফাইলের বিবৃতি প্রয়োগ করতে হলে আপনার .ini ফাইলটি ব্যবহার করা কার্যকর নয়। পরিবর্তে কনফিগার.পি ব্যবহার করা ভাল, তবে মানগুলি পরিবর্তিত হয় না এবং আপনি কেবল এটি কল করে ব্যবহার করেন, আমি.in.in ফাইল ব্যবহারের সাথে একমত।
কাউরশ

3

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

লিঙ্কগুলির বিষয়বস্তু সময়ের সাথে পরিবর্তিত হওয়ায় কেবল লিঙ্কগুলি বাদ দেওয়ার জন্য এসও নির্দেশিকাগুলি মেনে চলতে এখানে কাটা এবং আটকানো হয়েছে।

বৈশিষ্ট্য ডকুমেন্টেশন

আমরা আমাদের কনফিগারেশন সিস্টেমটি পেতে চেয়েছিলাম এমন প্রধান প্রয়োজনীয়তা এখানে রয়েছে:

শ্রেণিবদ্ধ কনফিগারেশন তথ্যের জন্য সমর্থন।

কমান্ড লাইন বিকল্প পার্সারগুলির সাথে সম্পূর্ণ সংহতকরণ। প্রায়শই আপনি একটি কনফিগারেশন ফাইলটি পড়তে চান তবে কমান্ড লাইন বিকল্পের সাহায্যে কিছু মানকে ওভাররাইড করে। আমাদের কনফিগারেশন সিস্টেমটি এই প্রক্রিয়াটিকে স্বয়ংক্রিয় করে তোলে এবং প্রতিটি কমান্ড লাইন বিকল্পকে কনফিগারেশন শ্রেণিবদ্ধের একটি নির্দিষ্ট বৈশিষ্ট্যের সাথে লিঙ্ক করার অনুমতি দেয় যা এটি ওভাররাইড হবে।

কনফিগারেশন ফাইলগুলি যা সেগুলি বৈধ পাইথন কোড। এটি অনেক কিছুই সম্পাদন করে। প্রথমত, আপনার কনফিগারেশন ফাইলগুলিতে যুক্তি স্থাপন করা সম্ভব হয় যা আপনার অপারেটিং সিস্টেম, নেটওয়ার্ক সেটআপ, পাইথন সংস্করণ ইত্যাদির উপর ভিত্তি করে বৈশিষ্ট্যগুলি সেট করে Second বার.বাম.নাম)। তৃতীয়ত, পাইথন ব্যবহার করা ব্যবহারকারীদের পক্ষে একটি কনফিগারেশন ফাইল থেকে অন্যটিতে কনফিগারেশন বৈশিষ্ট্যগুলি আমদানি করা সহজ করে। চতুর্থত, পাইথন ডায়নামিকভাবে টাইপ করা হলেও এর মধ্যে এমন টাইপ রয়েছে যা রানটাইমে পরীক্ষা করা যায়। সুতরাং, একটি কনফিগার ফাইলে একটি 1 হল পূর্ণসংখ্যা '1', অন্যদিকে '1' একটি স্ট্রিং।

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

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

এটির জন্য তারা মূলত 3 অবজেক্ট ক্লাস এবং একে অপরের সাথে তাদের সম্পর্কের সংজ্ঞা দেয়:

1) কনফিগারেশন - একত্রীকরণের জন্য কিছু বর্ধনের সাথে মূলত একটি চ্যানম্যাপ / বেসিক ডিক।

2) কনফিগারযোগ্য - বেস ক্লাসটি আপনি কনফিগার করতে চান এমন সমস্ত বিষয়কে সাবক্লাস করতে।

3) অ্যাপ্লিকেশন - একটি নির্দিষ্ট অ্যাপ্লিকেশন ফাংশন সম্পাদন করার জন্য ইনস্ট্যান্ট করা অবজেক্ট, বা একক উদ্দেশ্যে সফ্টওয়্যার জন্য আপনার মূল অ্যাপ্লিকেশন।

তাদের কথায়:

প্রয়োগ: প্রয়োগ

একটি অ্যাপ্লিকেশন একটি প্রক্রিয়া যা একটি নির্দিষ্ট কাজ করে। সর্বাধিক সুস্পষ্ট অ্যাপ্লিকেশন হ'ল আইপথন কমান্ড লাইন প্রোগ্রাম। প্রতিটি অ্যাপ্লিকেশন এক বা একাধিক কনফিগারেশন ফাইল এবং কমান্ড লাইন বিকল্পের একক সেট পড়ে এবং তারপরে অ্যাপ্লিকেশনটির জন্য একটি মাস্টার কনফিগারেশন অবজেক্ট তৈরি করে। এই কনফিগারেশন অবজেক্টটি অ্যাপ্লিকেশন তৈরি করা কনফিগারযোগ্য অবজেক্টগুলিতে প্রেরণ করা হয়। এই কনফিগারযোগ্য অবজেক্টগুলি অ্যাপ্লিকেশনটির আসল যুক্তি প্রয়োগ করে এবং কনফিগারেশন অবজেক্টের মাধ্যমে কীভাবে তাদের কনফিগার করতে হয় তা জানেন।

অ্যাপ্লিকেশনগুলির সর্বদা একটি লগ বৈশিষ্ট্য থাকে যা একটি কনফিগার করা লগার। এটি প্রতি অ্যাপ্লিকেশন কেন্দ্রীয় লগিং কনফিগারেশন অনুমতি দেয়। কনফিগারযোগ্য: কনফিগারযোগ্য

একটি কনফিগারযোগ্য হ'ল একটি নিয়মিত পাইথন ক্লাস যা কোনও অ্যাপ্লিকেশনে সমস্ত প্রধান শ্রেণীর জন্য বেস ক্লাস হিসাবে কাজ করে। কনফিগারযোগ্য বেস শ্রেণিটি হালকা ওজনের এবং শুধুমাত্র একটি কাজ করে।

এই কনফিগারযোগ্য হ্যাশট্রেটগুলির একটি সাবক্লাস যা নিজে কনফিগার করতে জানে to মেটাডেটা কনফিগারেশন সহ শ্রেণীর স্তরের বৈশিষ্ট্য = কমান্ড লাইন এবং কনফিগারেশন ফাইলগুলি থেকে কনফিগার করা যায় এমন মানগুলি হয়ে যায়।

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

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