@@ -87,28 +87,35 @@ class ModuleType(ResolvableType):
87
87
Args:
88
88
module (str): Module that the type lives in.
89
89
name (str): Name of the type that is promised.
90
+ allow_fail (bool, optional): If the type is does not exist in `module`,
91
+ do not raise an `AttributeError`.
90
92
"""
91
93
92
- def __init__ (self , module , name ):
94
+ def __init__ (self , module , name , allow_fail = False ):
93
95
if module in {"__builtin__" , "__builtins__" }:
94
96
module = "builtins"
95
97
ResolvableType .__init__ (self , f"ModuleType[{ module } .{ name } ]" )
96
98
self ._name = name
97
99
self ._module = module
100
+ self ._allow_fail = allow_fail
98
101
99
- def __new__ (cls , module , name ):
102
+ def __new__ (cls , module , name , allow_fail = False ):
100
103
return ResolvableType .__new__ (cls , f"ModuleType[{ module } .{ name } ]" )
101
104
102
105
def retrieve (self ):
103
106
"""Attempt to retrieve the type from the reference module.
104
107
105
108
Returns:
106
- :class:`ModuleType`: `self` .
109
+ bool: Whether the retrieval succeeded .
107
110
"""
108
111
if self ._type is None :
109
112
if self ._module in sys .modules :
110
113
type = sys .modules [self ._module ]
111
114
for name in self ._name .split ("." ):
115
+ # If `type` does not contain `name` and `self._allow_fail` is
116
+ # set, then silently fail.
117
+ if not hasattr (type , name ) and self ._allow_fail :
118
+ return False
112
119
type = getattr (type , name )
113
120
self .deliver (type )
114
121
return self ._type is not None
0 commit comments