- Notifications
You must be signed in to change notification settings - Fork674
chore: simplify multi-nested try blocks#2114
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -101,47 +101,43 @@ def __setstate__(self, state: Dict[str, Any]) -> None: | ||
| self.__dict__["_module"] = importlib.import_module(module_name) | ||
| def __getattr__(self, name: str) -> Any: | ||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Nice to see things get flattened! 😁 I'm a bit torn on the EAFP/LBYL topic here, using try/except on the re-raise would allow us to keep the original raise-from, though not sure how important that is. I would maybe also consider a compromise like this: def__getattr__(self,name:str)->Any:try:returnself.__dict__["_updated_attrs"][name]exceptKeyError:passtry:value=self.__dict__["_attrs"][name]# If the value is a list, we copy it in the _updated_attrs dict# because we are not able to detect changes made on the object# (append, insert, pop, ...). Without forcing the attr# creation __setattr__ is never called, the list never ends up# in the _updated_attrs dict, and the update() and save()# method never push the new data to the server.# See https://github.com/python-gitlab/python-gitlab/issues/306## note: _parent_attrs will only store simple values (int) so we# don't make this check in the next except block.ifisinstance(value,list):self.__dict__["_updated_attrs"][name]=value[:]returnself.__dict__["_updated_attrs"][name]returnvalueexceptKeyError:passtry:returnself.__dict__["_parent_attrs"][name]exceptKeyErrorasexc:message= (f"{type(self).__name__!r} object has no attribute{name!r}" )ifself._created_from_list:message= (f"{message}\n\n"+textwrap.fill(f"{self.__class__!r} was created via a list() call and "f"only a subset of the data may be present. To ensure "f"all data is present get the object using a "f"get(object.id) call. For more details, see:" )+f"\n\n{_URL_ATTRIBUTE_ERROR}" )raiseAttributeError(message)fromexc Not sure. Thoughts? MemberAuthor
| ||
| if name in self.__dict__["_updated_attrs"]: | ||
| return self.__dict__["_updated_attrs"][name] | ||
| if name in self.__dict__["_attrs"]: | ||
| value = self.__dict__["_attrs"][name] | ||
| # If the value is a list, we copy it in the _updated_attrs dict | ||
| # because we are not able to detect changes made on the object | ||
| # (append, insert, pop, ...). Without forcing the attr | ||
| # creation __setattr__ is never called, the list never ends up | ||
| # in the _updated_attrs dict, and the update() and save() | ||
| # method never push the new data to the server. | ||
| # See https://github.com/python-gitlab/python-gitlab/issues/306 | ||
| # | ||
| # note: _parent_attrs will only store simple values (int) so we | ||
| # don't make this check in the next block. | ||
| if isinstance(value, list): | ||
| self.__dict__["_updated_attrs"][name] = value[:] | ||
| return self.__dict__["_updated_attrs"][name] | ||
| return value | ||
| if name in self.__dict__["_parent_attrs"]: | ||
| return self.__dict__["_parent_attrs"][name] | ||
| message = f"{type(self).__name__!r} object has no attribute {name!r}" | ||
| if self._created_from_list: | ||
| message = ( | ||
| f"{message}\n\n" | ||
| + textwrap.fill( | ||
| f"{self.__class__!r} was created via a list() call and " | ||
| f"only a subset of the data may be present. To ensure " | ||
| f"all data is present get the object using a " | ||
| f"get(object.id) call. For more details, see:" | ||
| ) | ||
| + f"\n\n{_URL_ATTRIBUTE_ERROR}" | ||
| ) | ||
| raise AttributeError(message) | ||
| def __setattr__(self, name: str, value: Any) -> None: | ||
| self.__dict__["_updated_attrs"][name] = value | ||