Помогите LSP с помощью динамически импортируемых методов.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Помогите LSP с помощью динамически импортируемых методов.

Сообщение Anonymous »

У меня есть структура каталогов с несколькими подкаталогами, каждый из которых содержит файлы Python (.py), определяющие классы. Эти классы необходимо динамически импортировать и присоединять как методы к родительскому классу. Родительский класс должен иметь подклассы, соответствующие каждому подкаталогу, и подклассы должны содержать методы, полученные из файлов Python в этих подкаталогах.

Код: Выделить всё

    def __generate_validation_attributes__(self) -> None:
_dir = Path(__file__).parent

# Get list of subdirectories in my_dir
subdirectories = [d for d in my_dir.iterdir() if d.is_dir()]

for subdir in subdirectories:
subclass_name = subdir.name
subclass = type(subclass_name, (), {})
subclass.__doc__ = f"subdirectory {subclass_name}"

# List of Python files in the subdirectory, excluding __init__.py
py_files = [f for f in subdir.glob("*.py") if f.name != "__init__.py"]

for py_file in py_files:
# Get module name including package
module_relative_path = py_file.relative_to(subdirectories)
module_name = ".".join(module_relative_path.with_suffix("").parts)

# Import the module from the file path
spec = importlib.util.spec_from_file_location(
module_name,
py_file,
)
module = importlib.util.module_from_spec(spec)

# Find classes defined in the module
classes_in_module = inspect.getmembers(
module,
lambda member: inspect.isclass(member)
and member.__name__.lower() == py_file.stem.replace("_", "").lower(),
)

for _, class_obj in classes_in_module:
# Attach the method to the subclass
self.validation_classes[class_obj.__name__] = class_obj
setattr(
subclass,
class_obj.__name__,
self. __make_method__(class_obj),
)

# Attach the subclass to the parent class
setattr(self, subclass_name, subclass())

def __make_method__(self, class_obj: type) -> Callable[..., Validate]:
def validation_method(*args, **kwargs) -> Validate:
return self.__create_validation_class__(
class_obj,
*args,
**kwargs,
)

validation_method.__name__ = class_obj.__name__
validation_method.__doc__ = class_obj.__doc__

return validation_method

Приведенный фрагмент кода обеспечивает эту функциональность путем перебора подкаталогов, динамического создания подклассов и присоединения методов из файлов Python к соответствующим подклассам. Код работает должным образом, позволяя получать доступ к подклассам и методам с использованием желаемого синтаксиса:

Код: Выделить всё

cls = MyClass()
cls.subdirectory.ChildClass("bla")
Проблема возникает при использовании автодополнения протокола языкового сервера (LSP) для предоставления предложений для подклассов (подкаталог) и методов (ChildClass). Одним из возможных решений является создание файлов-заглушек (.pyi) для предоставления подсказок по типам и включения автозаполнения. Однако создание файлов-заглушек вручную может оказаться утомительной задачей и потребует копирования и вставки строк документации.
Есть ли лучший вариант для достижения желаемого результата?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ed-methods
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»