def __getattr__(name): # For backwards compatibility, continue to make the collections ABCs # through Python 3.6 available through the collections module. # Note, no new collections ABCs were added in Python 3.7 if name in _collections_abc.__all__: obj = getattr(_collections_abc, name) import warnings warnings.warn("Using or importing the ABCs from 'collections' instead " "of from 'collections.abc' is deprecated since Python 3.3," "and in 3.9 it will stop working", DeprecationWarning, stacklevel=2) globals()[name] = obj return obj raise AttributeError(f'module {__name__!r} has no attribute {name!r}') 这段源码做什么的?
时间: 2024-02-10 20:28:48 浏览: 137
这段源码定义了一个特殊方法 `__getattr__`,它是在访问一个不存在的属性时被调用的。这个方法主要用于向后兼容,即在 Python 3.6 及以下版本中,通过 `collections` 模块访问 `collections.abc` 中的抽象基类(Abstract Base Classes,ABCs)。
具体来说,这段代码的作用如下:
1. 首先检查要访问的属性名 `name` 是否在 `_collections_abc` 模块的 `__all__` 列表中。`__all__` 是一个定义了该模块中公开的属性和方法的列表。
2. 如果属性名 `name` 存在于 `_collections_abc.__all__` 中,则获取对应的对象并赋值给变量 `obj`。
3. 接下来,发出一个警告,提醒用户在 Python 3.3 之后不再应该使用 `collections` 模块而是应该使用 `collections.abc` 模块来访问抽象基类。
4. 将获取到的对象 `obj` 存储在全局命名空间中,并使用与要访问的属性名相同的键。
5. 最后,返回获取到的对象 `obj`。
如果要访问的属性名不在 `_collections_abc.__all__` 中,那么会抛出 `AttributeError` 异常,并提示模块名和属性名不存在。这段源码主要用于在 Python 3.6 及以下版本中继续提供通过 `collections` 模块访问 `collections.abc` 中抽象基类的功能。
相关问题
def__getattr__(self,name:str)->Union[Tensor,'Module']:
这是一个 Python 类中的特殊方法 `__getattr__`,用于拦截对类实例属性的访问操作。当访问一个属性,但该属性在实例本身以及其类及父类的属性中都不存在时,Python 会调用 `__getattr__` 方法。该方法接受一个字符串参数 `name`,表示要访问的属性名,返回值可以是一个 `Tensor` 对象或者另一个 `Module` 对象。
具体而言,当我们使用类似 `model.weight` 的方式访问模型 `model` 的参数 `weight` 时,如果 `weight` 属性不存在,Python 会调用 `__getattr__` 方法,将 `weight` 作为参数传入。我们可以在 `__getattr__` 中根据 `name` 的值,返回相应的参数或 `Module` 对象。这种方式可以让我们实现动态创建属性的功能,例如在模型中添加新的层或参数。
需要注意的是,如果我们想要拦截所有属性的访问,而不是仅限于不存在的属性,可以使用 `__getattribute__` 方法。但是,由于该方法会影响到所有属性访问,包括已经存在的属性,因此需要谨慎使用。
VALID_MODULE_NAME = re.compile(r'[_a-z]\w*\.py$', re.IGNORECASE) class _FailedTest(case.TestCase): _testMethodName = None def __init__(self, method_name, exception): self._exception = exception super(_FailedTest, self).__init__(method_name) def __getattr__(self, name): if name != self._testMethodName: return super(_FailedTest, self).__getattr__(name) def testFailure(): raise self._exception return testFailure
这段代码是 Python 的 unittest 模块中的一部分。它定义了一个名为 _FailedTest 的类,这个类继承自 TestCase 类,用于测试用例执行失败时的处理。它包含一个 testFailure 方法,当测试用例执行失败时,该方法会被调用并且抛出 _exception 异常,_exception 是在 _FailedTest 的 __init__ 方法中传入的。这个类的作用是为了在测试用例执行失败时,能够更好地处理和报告错误。
阅读全文