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