resueltos programacion poo otra orientada objetos metodo llamar importar ejercicios crear constructores clases clase python dynamic pylint

python - programacion - Evite la advertencia Pylint E1101: ''La instancia de... no tiene.. miembro'' para la clase con atributos dinĂ¡micos



poo python 3 (2)

Imagine una función que agrega atributos dinámicamente a un objeto usando setattr . El motivo para hacerlo es que quiero asignar una estructura externa (por ejemplo, un árbol de parámetros dado) a un objeto:

my_object = SomeClass() apply_structure(my_object, some_descriptor) my_object.device1.enabled = True

Técnicamente esto funciona pero, por supuesto, Pylint se queja justamente de que ''device1'' no es miembro de SomeClass .

Podría deshabilitar la advertencia, pero eso sería malo (porque todavía quiero recibir la advertencia en todos los casos cuando el atributo no existe debido a errores ortográficos, etc.).

¿Existe una forma común y legal (a prueba de Pylint) de agregar miembros dinámicamente a un objeto que no genere advertencias?

Alternativamente: ¿Puedo deshabilitar Pylint para un solo objeto en lugar de una línea / bloque / archivo?

Explicación :

Quizás se pregunte por qué debo equipar un objeto con atributos de miembro dinámicamente cuando planeo acceder a estos atributos de forma rígida más adelante.

La razón es: tengo una parte dinámica del programa (donde ocurre la decoración) y una parte estática que está especializada para un determinado escenario . Así que también podría crear una clase estática para este escenario, pero eso sería una exageración en muchas situaciones.

El siguiente código especializado podría permitir el acceso a algún parámetro de un dispositivo que podría estar conectado a algún bus:

class MyDeviceHandler: on_get_some_subtree_element(self): return _some_internal_value on_set_some_subtree_element(self, value): _some_internal_value = value dev = MyDeviceHandler() decorate_object_with_device_structure(dev, ''some/attached/device'') dev.some.subtree.element = 5 <--- will call the set-callback x = dev.some.subtree.element <--- will call the get-callback

Por lo tanto, la estructura detrás de ''some/attached/device'' puede ser arbitraria y muy compleja y no quiero reproducirla en una estructura de clase.

Una forma de deshacerse de esta advertencia sería crear / acceder a un árbol basado en dict :

dev[''some''][''subtree''][''element''] = 5

Pero esto es más difícil de escribir y no es agradable de leer; solo haría esto para calmar a Pylint.


Podrías usar una subclase:

class MyClass(Someclass): def init(self): super().__init__() self.device1 = WhateverDevice1Is() my_object = MyClass() apply_structure(my_object, some_descriptor) my_object.device1.enabled = True

Nota: Python3


Solo para proporcionar la respuesta que me funciona ahora, ya que The Compiler sugirió que puede agregar una regla para la clase problemática en sus proyectos .pylintrc :

[TYPECHECK] ignored-classes=Fysom,MyClass