using inspect.unwrap on `maurix.types.Obj` places the object into a state where serializing raises a RecursionError
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 45/100
Direzione di ricerca
Inizia da mautrix/types/util/obj.py, in particolare da getattr e serialize(), e riproduci l’esempio inspect.unwrap(mautrix.types.Obj()) dell’issue. Verifica che i nomi dunder o sunder mancanti non vengano creati dinamicamente, mentre gli attributi normali mancanti mantengano il comportamento esistente. Il lavoro è completato quando l’esempio non lascia più l’oggetto serializzabile ricorsivamente e solleva solo l’errore di unwrap previsto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
>>> import mautrix.types
>>> import inspect
>>> inspect.unwrap(mautrix.types.Obj())
Traceback (most recent call last):
File "<python-input-2>", line 1, in <module>
inspect.unwrap(mautrix.types.Obj())
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
File "/home/lily/.pyenv/versions/3.13.2/lib/python3.13/inspect.py", line 791, in unwrap
raise ValueError('wrapper loop when unwrapping {!r}'.format(f))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
File "/home/lily/Documents/matrix-codecrimes/.venv/lib/python3.13/site-packages/mautrix/types/util/obj.py", line 36, in __repr__
return repr(self.serialize())
~~~~~~~~~~~~~~^^
File "/home/lily/Documents/matrix-codecrimes/.venv/lib/python3.13/site-packages/mautrix/types/util/obj.py", line 62, in serialize
k: v.serialize() if isinstance(v, Serializable) else v
~~~~~~~~~~~^^
File "/home/lily/Documents/matrix-codecrimes/.venv/lib/python3.13/site-packages/mautrix/types/util/obj.py", line 62, in serialize
k: v.serialize() if isinstance(v, Serializable) else v
~~~~~~~~~~~^^
File "/home/lily/Documents/matrix-codecrimes/.venv/lib/python3.13/site-packages/mautrix/types/util/obj.py", line 62, in serialize
k: v.serialize() if isinstance(v, Serializable) else v
~~~~~~~~~~~^^
[Previous line repeated 986 more times]
RecursionError: maximum recursion depth exceeded
this appears to be caused because inspect.wrapper attempts to access .__wrapped__ which causes the __getattr__ to create it, which is bad.
maybe it would be a good idea not to create __dunder__ and _sunder_ names? so something like:
def __getattr__(self, name):
if name.startswith("_") and name.endswith("_"):
raise AttributeError(name)
...
just to prevent brainfarts: this wont prevent access to defined dunders since __getattr__ is only called when the name cannot be found through other means.
- Lingua principale
- Python
- Stelle
- 249
- Fork
- 84
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di mautrix/python
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
Tutte le issue di mautrix/python
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
use-agent-os/agent-os#3314 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
BasedHardware/omi#15662 · 1 commento ·
-
documentation help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
AiursoftWeb/AnduinOS-2#19 ·