@@ -134,7 +134,7 @@ def _get_external(module_name: str, access_path: Sequence[str]):
134134 for attr in access_path :
135135 member_type = getattr (member_type , attr )
136136 return member_type
137- except KeyError :
137+ except ( KeyError , AttributeError ) :
138138 # handle modules in namespace packages
139139 module_path = "." .join ([module_name , * access_path ])
140140 if module_path in sys .modules :
@@ -215,7 +215,7 @@ class SelectivePolicy(EvaluationPolicy):
215215 allowed_getitem_external : set [tuple [str , ...]] = field (default_factory = set )
216216
217217 allowed_getattr : set [MayHaveGetattr ] = field (default_factory = set )
218- allowed_getattr_external : set [tuple [str , ...]] = field (default_factory = set )
218+ allowed_getattr_external : set [tuple [str , ...] | str ] = field (default_factory = set )
219219
220220 allowed_operations : set = field (default_factory = set )
221221 allowed_operations_external : set [tuple [str , ...]] = field (default_factory = set )
@@ -225,18 +225,23 @@ class SelectivePolicy(EvaluationPolicy):
225225 )
226226
227227 def can_get_attr (self , value , attr ):
228+ allowed_getattr_external : set [tuple [str , ...]] = {
229+ path if isinstance (path , tuple ) else tuple (path .split ("." ))
230+ for path in self .allowed_getattr_external
231+ }
232+
228233 has_original_attribute = _has_original_dunder (
229234 value ,
230235 allowed_types = self .allowed_getattr ,
231236 allowed_methods = self ._getattribute_methods ,
232- allowed_external = self . allowed_getattr_external ,
237+ allowed_external = allowed_getattr_external ,
233238 method_name = "__getattribute__" ,
234239 )
235240 has_original_attr = _has_original_dunder (
236241 value ,
237242 allowed_types = self .allowed_getattr ,
238243 allowed_methods = self ._getattr_methods ,
239- allowed_external = self . allowed_getattr_external ,
244+ allowed_external = allowed_getattr_external ,
240245 method_name = "__getattr__" ,
241246 )
242247
@@ -268,7 +273,7 @@ def can_get_attr(self, value, attr):
268273 return True # pragma: no cover
269274
270275 # Properties in subclasses of allowed types may be ok if not changed
271- for module_name , * access_path in self . allowed_getattr_external :
276+ for module_name , * access_path in allowed_getattr_external :
272277 try :
273278 external_class = _get_external (module_name , access_path )
274279 external_class_attr_val = getattr (external_class , attr )
0 commit comments