Создание субмодуля Python - PullRequest
2 голосов
/ 15 октября 2019

Я хочу создать инструмент под названием unifile для сохранения и открытия файлов, подобных этому unifile.open.yaml("file.yaml").

Это моя структура

unifile
|
├-open
|    └--__init__.py
|
└-save
     └--__init__.py

Код, который вызывает мой модуль:

import unifile
a = unifile.open.yaml("file.yaml")

open / __ init __. Py

import yaml
class open():
    def yml(self, file_path):
        try:
            with open(file_path, "r", encoding="utf-8") as yaml_conf:
                yaml_file = yaml.safe_load(yaml_conf)

            return yaml_file
        except OSError:
            print("Can't load yaml")

1 ошибка при импорте unifile всегда говорят:

модуль unifileнет открытого атрибута

2 ошибка в __init__.py Я не могу открыть файл

[pylint] Менеджер контекста 'open' не реализует enter и выход . [не-контекст-менеджер]

Ответы [ 3 ]

0 голосов
/ 15 октября 2019
  1. Вы получаете эту ошибку, потому что unifile не является пакетом, на верхнем уровне нет файла init .py, такого же, как open и save. Вы также не можете напрямую вызывать open.yml, потому что open - это класс в пакете open, поэтому либо вам придется импортировать open из open, создать его экземпляр и затем вызывать iml для этого экземпляра.

    из open import open

    a = open (). Yml ('file.yml')

  2. Вы получаете эту ошибку, потому что пытаетесь переопределить существующее ключевое слово в python open , что вы должны строго запрещать делать. Так что вы должны называть свой класс всем, кроме зарезервированного ключевого слова.

0 голосов
/ 15 октября 2019

добавьте решение вашей проблемы, сделайте структуру вашего проекта такой.

добавить unifile/__init__.py файл в сам файл, а не в другие модули.

enter image description here

затем unifile/open/_open.py содержимое файла

import yaml

class Open():
    def __init__(self):
        pass
    def yml(self, file_path):
        try:
            with open(file_path, "r", encoding="utf-8") as yaml_conf:
                yaml_file = yaml.safe_load(yaml_conf)

            return yaml_file
        except OSError:
            print("Can't load yaml")

содержимое файла unifile/__init__.py

from .open._open import Open 

в терминале запускает программу, подобную этой

enter image description here

Кроме того, лучше сначала создать элемент объекта, а затем продолжить.

0 голосов
/ 15 октября 2019

Два вопроса, два awsers.

Сначала вы должны добавить файл инициализации в unifile, с этим питоном будет понятно, что unifile - это пакет с подпакетом.

Во-вторых, open - этовстроенная функция, и вы перезаписываете ее, вызывая ваш класс открытым. Измените свое имя класса, и оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...