Прочитать файл конфигурации YAML в Python - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь прочитать файл конфигурации YAML и отобразить его на терминале. Теперь я хочу попробовать что-то вроде проверки, что база данных (db) в файле YAML не Sqlite или Postgres, тогда возникнет исключение, но я не знаю как. Я пытался, но не смог, что я делаю не так?

Мой test.yaml файл:

database: 

dbopt:
   host: bvcbvcbvcb.com
   port: 5432
   dbname: db1
   user: username
   password: 1234
   client_encoding: utf-8
   connect_timeout: 60
   sslmode: none

query:
   select * from manufacturing_product

Мой код:

# process_yaml.py file`
import yaml

with open(r'D:\Python\test.yaml') as file:
    # The FullLoader parameter handles the conversion from YAML
    # scalar values to Python the dictionary format
    data = yaml.full_load(file)

    for item, doc in data.items():
        print(item, ":", doc)

    def __init__(self, dbconf):
        self._dbconf = dict(dbconf)

        # checking for database type
        dbtype = self.get_db_type()
        if dbtype != 'sqlite' and dbtype != 'postgres':
            raise exceptions.InvalidConfigError(
                'E01001', 'Invalid database type, should be sqlite or postgres.')
        else:
            self.dbtype = dbtype

Моя программа все еще не может поймать исключение. Мой терминал:

database: 

dbopt:
   host: 
   port: 5432
   dbname: db1
   user: username
   password: 1234
   client_encoding: utf-8
   connect_timeout: 60
   sslmode: none

query:
   select * from manufacturing_product

1 Ответ

1 голос
/ 11 февраля 2020

В вашем коде отсутствует несколько фрагментов, и ваша функция __init__ никогда не вызывается. Вы, вероятно, скопировали его из некоторого примера с классом, который также имел метод get_db_type().

class InvalidConfigError(Exception):
    pass

class DB:
    def __init__(self, dbconf):
        self._dbconf = dict(dbconf)

        # checking for database type
        dbtype = self.get_db_type()
        if dbtype != 'sqlite' and dbtype != 'postgres':
            raise InvalidConfigError(
                'E01001', 'Invalid database type, should be sqlite or postgres.')
        else:
            self.dbtype = dbtype

    def get_db_type(self):
        return self._dbconf['db']


with open('test.yaml') as file:
    data = yaml.full_load(file)

    for item, doc in data.items():
        print(item, ":", doc)


    db = DB(data)

, который печатает:

db : mysql
dbopt : {'host': 'bvcbvcbvcb.com', 'port': 5432, 'dbname': 'db1', 'user': 'username', 'password': '1234', 'client_encoding': 'utf-8', 'connect_timeout': 60, 'sslmode': 'none'}
query : select * from manufacturing_product

, а затем дает:

init повышение InvalidConfigError ( main .InvalidConfigError: ('E01001', 'Недопустимый тип базы данных, должен быть sqlite или postgres.') Ошибка процесса Команда '[' ryd ',' --force ',' so-60160957.ryd ']' вернул ненулевой статус выхода 1.

Комментарий

# The FullLoader parameter handles the conversion from YAML
# scalar values to Python the dictionary format

скорее относится к FullLoader анализирует YAML и пытается создать все узлы в Python объектах: отображение YAML в dict, последовательность YAML в список и узлы YAML, которые являются скалярами для типов Python (string, integer, float, bool, et c.)

...