(self, name, value)
| 67 | raise AttributeError("'{}' object has no attribute '{}'".format(type(self).__name__, name)) |
| 68 | |
| 69 | def __setattr__(self, name, value) -> None: |
| 70 | from .parameter import Parameter |
| 71 | |
| 72 | # Improved module setattr to handle one edge case: |
| 73 | # attribute could be first set to None and later reset to Parameter / Module class |
| 74 | |
| 75 | try: |
| 76 | super().__getattribute__(name) |
| 77 | |
| 78 | except AttributeError: |
| 79 | # if base class doesn't have the attribute, no matter we init or reset: |
| 80 | # - keep Parameter and Module attrs in this Module class |
| 81 | # - leave all other attrs in base class |
| 82 | if isinstance(value, Parameter): |
| 83 | self.__dict__.get("_parameters")[name] = value |
| 84 | elif isinstance(value, Module): |
| 85 | self.__dict__.get("_modules")[name] = value |
| 86 | else: |
| 87 | super().__setattr__(name, value) |
| 88 | |
| 89 | else: |
| 90 | # if base class has the attribute, reset as follows: |
| 91 | # - when reset as Parameter or Module attr, remove from base & add to this Module class |
| 92 | # - other types reset and remain in base class |
| 93 | if isinstance(value, Parameter): |
| 94 | super().__delattr__(name) |
| 95 | self.__dict__.get("_parameters")[name] = value |
| 96 | elif isinstance(value, Module): |
| 97 | super().__delattr__(name) |
| 98 | self.__dict__.get("_modules")[name] = value |
| 99 | else: |
| 100 | super().__setattr__(name, value) |
| 101 | |
| 102 | def named_modules(self, memo=None, prefix="", remove_duplicate=True): |
| 103 | if memo is None: |
nothing calls this directly
no test coverage detected