Rumah > pembangunan bahagian belakang > Tutorial Python > Ke Arah Fail Konfigurasi Python yang Mudah Versi 1

Ke Arah Fail Konfigurasi Python yang Mudah Versi 1

Susan Sarandon
Lepaskan: 2024-12-02 14:55:19
asal
770 orang telah melayarinya

pengenalan

Seperti yang dinyatakan dalam artikel sebelumnya, versi simplistik penuh dengan masalah termasuk kebolehskalaan, kebolehselenggaraan dan kebolehlanjutan.

Sambungan ringkas daripada Versi Ø adalah untuk mencuba dan menyembunyikan butiran konfigurasi Python di sebalik kelas hartanah. Iaitu melaksanakan kelas data pseudo yang mendedahkan satu set sifat yang membenarkan pembangun hanya melakukan set dan dapatkan panggilan untuk mendapatkan semula dan mengekalkan nilai sifat.

Dari sudut pandangan penyelenggara, pelaksanaan ini harus menyokong keupayaan berikut.

  1. Benarkan penciptaan bahagian konfigurasi secara automatik jika bahagian tersebut tiada
  2. Benarkan penciptaan nilai harta secara automatik jika nilai tersebut tiada
  3. Sifat harus dilaksanakan sebagai baca lalu dan tulis.
  4. Untuk mengelakkan kos permulaan untuk perkara di atas kerana aplikasi membuat instantiate kelas ini sepanjang aplikasi kelas ini mestilah Singleton.

Perwakilan Kelas

Rajah Kelas UML berikut menerangkan kelas yang akan memenuhi keperluan dalam pengenalan. Kelas ConfiguratonProperties memenuhi keperluan 1 & 2 dengan kaedah yang dilindungi .createMissingSections dan .createMissingKeys

Towards Effortless Python Configuration Files Version 1

Cipta Perlaksanaan

Buat Bahagian Hilang

Kod berikut menunjukkan pelaksanaan. Perhatikan bahawa bahagian tambahan memerlukan kemas kini kod untuk kaedah ini

SECTION_GENERAL:  str = 'General'
SECTION_DATABASE: str = 'Database'

def _createMissingSections(self):
    """
    Create missing sections.  Add additional calls for
    each defined section
    """
    self._createMissingSection(SECTION_GENERAL)
    self._createMissingSection(SECTION_DATABASE)
Salin selepas log masuk
Salin selepas log masuk

Kod bahagian yang hilang adalah seperti berikut.

def _createMissingSection(self, sectionName: str):
    """
    Only gets created if it is missing
    Args:
        sectionName: The potential section to create
    """
    hasSection: bool = self._configParser.has_section(sectionName)
    self.logger.info(f'hasSection: {hasSection} - {sectionName}')
    if hasSection is False:
        self._configParser.add_section(sectionName)
Salin selepas log masuk
Salin selepas log masuk

Cipta Kekunci Hilang

Kod berikut menunjukkan pelaksanaan. Sekali lagi ambil perhatian jika kami menambah bahagian tambahan, pembangun mesti menambah gelung tambahan untuk bahagian baharu.

GENERAL_PREFERENCES: Dict[str, str] = {
    'debug':    'False',
    'logLevel': 'Info'
}

DATABASE_PREFERENCES: Dict[str, str] = {
    'dbName': 'example_db',
    'dbHost': 'localhost',
    'dbPort': '5432'
}

def _createMissingKeys(self):
    """
    Create missing keys and their values.  Add additional calls for
    each defined section.
    """
    for keyName, keyValue in GENERAL_PREFERENCES.items():
        self._createMissingKey(sectionName=SECTION_GENERAL, keyName=keyName, defaultValue=keyValue)
    for keyName, keyValue in DATABASE_PREFERENCES.items():
        self._createMissingKey(sectionName=SECTION_DATABASE, keyName=keyName, defaultValue=keyValue)
Salin selepas log masuk
Salin selepas log masuk

Kod kunci yang hilang adalah seperti berikut. Perhatikan sebarang kunci yang hilang terus dikekalkan dengan serta-merta.

def _createMissingKey(self, sectionName: str, keyName: str, defaultValue: str):
    """
    Only gets created if it is missing.  The configuration file is updated
    immediately for each missing key and its value

    Args:
        sectionName:   The section name where the key resides
        keyName:       The key name
        defaultValue:  Itsß value
    """
    if self._configParser.has_option(sectionName, keyName) is False:
        self._configParser.set(sectionName, keyName, defaultValue)
        self._saveConfiguration()
Salin selepas log masuk

Sifat Kelas

Contoh pelaksanaan untuk keperluan 3 ikuti.

String Properties

Perhatikan bahawa menetapkan sifat tulis-melalui ke fail konfigurasi dengan menetapkan sifat itu dan meneruskannya dengan serta-merta. Sifat membaca adalah baca lalu dengan berkesan kerana cara kami menulis sifat tetap dengan segera.

@property
def dbName(self) -> str:
    return self._configParser.get(SECTION_DATABASE, 'dbName')

@dbName.setter
def dbName(self, newValue: str):
    self._configParser.set(SECTION_DATABASE, 'dbName', newValue)
    self._saveConfiguration()
Salin selepas log masuk

Sifat Integer

Sifat integer menggunakan kaedah .getint untuk mendapatkan semula nilai. Apabila menetapkan sifat, pembangun mesti menukarnya secara manual kepada rentetan.

@property
def dbPort(self) -> int:
    return self._configParser.getint(SECTION_DATABASE, 'dbPort')

@dbPort.setter
def dbPort(self, newValue: int):
    self._configParser.set(SECTION_DATABASE, 'dbPort', str(newValue))
    self._saveConfiguration()
Salin selepas log masuk

Sifat Boolean

Sifat Boolean menggunakan kaedah .getboolean untuk mendapatkan semula nilainya. Apabila menetapkan sifat, pembangun mesti menukarnya secara manual kepada rentetan.

SECTION_GENERAL:  str = 'General'
SECTION_DATABASE: str = 'Database'

def _createMissingSections(self):
    """
    Create missing sections.  Add additional calls for
    each defined section
    """
    self._createMissingSection(SECTION_GENERAL)
    self._createMissingSection(SECTION_DATABASE)
Salin selepas log masuk
Salin selepas log masuk

Sifat Penghitungan

Saya tidak akan meliputi sifat penghitungan dalam artikel ini. Terdapat dua cara untuk mengekalkannya, dengan nama atau nilainya. Setiap mekanisme memerlukan cara yang sedikit berbeza untuk menyahsiri nilai kembali kepada jenis penghitungan.

Mengakses dan Mengubah Suai Sifat

Coretan kod berikut menunjukkan cara mengakses dan mengubah suai sifat.

def _createMissingSection(self, sectionName: str):
    """
    Only gets created if it is missing
    Args:
        sectionName: The potential section to create
    """
    hasSection: bool = self._configParser.has_section(sectionName)
    self.logger.info(f'hasSection: {hasSection} - {sectionName}')
    if hasSection is False:
        self._configParser.add_section(sectionName)
Salin selepas log masuk
Salin selepas log masuk

Coretan di atas menghasilkan output berikut

GENERAL_PREFERENCES: Dict[str, str] = {
    'debug':    'False',
    'logLevel': 'Info'
}

DATABASE_PREFERENCES: Dict[str, str] = {
    'dbName': 'example_db',
    'dbHost': 'localhost',
    'dbPort': '5432'
}

def _createMissingKeys(self):
    """
    Create missing keys and their values.  Add additional calls for
    each defined section.
    """
    for keyName, keyValue in GENERAL_PREFERENCES.items():
        self._createMissingKey(sectionName=SECTION_GENERAL, keyName=keyName, defaultValue=keyValue)
    for keyName, keyValue in DATABASE_PREFERENCES.items():
        self._createMissingKey(sectionName=SECTION_DATABASE, keyName=keyName, defaultValue=keyValue)
Salin selepas log masuk
Salin selepas log masuk

Kesimpulan

Kod sumber untuk artikel ini ada di sini. Kelas sokongan SingletonV3 ada di sini

Hasil pelaksanaan pada mulanya membuatkan saya berpuas hati sebagai pengguna kod tersebut. Saya dapat mendapatkan dan menetapkan sifat yang ditaip. Walau bagaimanapun, sebagai penyelenggara kod saya terpaksa mengemas kini struktur data kod dan gelung kod secara manual apabila saya menambah bahagian baharu dan sifat baharu. Selain itu, semua yang saya dapat daripada ini ialah mekanisme/corak untuk digunakan apabila saya memerlukan sifat konfigurasi baharu dalam aplikasi yang berbeza.

Kelebihan

  • Taip mudah akses selamat kepada sifat aplikasi
  • Menggunakan singleton di bahagian lain aplikasi saya memberikan akses yang konsisten dan boleh dipercayai kepada hartanah tanpa mengira bahagian mana aplikasi mengubah nilai

Keburukan

  • Kemas kini untuk menambah sifat baharu adalah membosankan
  • Banyak kod plat dandang
  • Tiada kebolehgunaan semula merentas pelbagai aplikasi. Pada asasnya, saya baru sahaja mempunyai templat

Lihat siaran saya seterusnya yang mendokumentasikan pelaksanaan alternatif untuk menangani kelemahan yang saya senaraikan, sambil mengekalkan kelebihannya.

Atas ialah kandungan terperinci Ke Arah Fail Konfigurasi Python yang Mudah Versi 1. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan