== Why is this an issue? Accessing a non-existing member on an object will raise in most case an ``++AttributeError++`` exception. This rule raises an issue when a non-existing member is accessed on a class instance and nothing indicates that this was expected. === Noncompliant code example [source,python] ---- def access_attribute(): x = 42 return x.isnumeric() # Noncompliant ---- === Compliant solution [source,python] ---- def access_attribute(): x = "42" return x.isnumeric() ---- === Exceptions No issue will be raised: * in ``++try ... except++`` blocks when ``++AttributeError++`` is caught. * in ``++if hasattr(...)++`` blocks. * when the accessed object has methods ``++__getattribute__++`` or ``++__getattr__++``. These methods will override the default attribute access behavior. * when a class or its parent classes use ``++setattr++``. This can be used to add dynamically members to the class, even if it is not recommended. You can also disable any issue for a given class by adding it to this rule's ignoredClassesForMemberValidation property. == Resources * https://youtu.be/NiSqG6s8skA[The Magic of Attribute Access - by Petr Viktorin - EuroPython Conference 2014] ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) include::message.adoc[] include::parameters.adoc[] include::highlighting.adoc[] endif::env-github,rspecator-view[]