py/with macro doesn't bind the return value of __enter__ method
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 58/100
Direção de pesquisa
Comece com src/libpython_clj2/python/with.clj#L45-L63 e o teste existente em test/libpython_clj2/python_test.clj#L167. Adicione cobertura usando um gerenciador de contexto cujo enter retorne um objeto diferente; em seguida, verifique se o valor vinculado é esse valor retornado e se o comportamento existente de with continua passando.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
The py/with macro implementation doesn't correctly follow Python's with statement semantics. According to the Python documentation, the value bound in a with statement should be the return value of calling __enter__() on the context manager:
manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager) # This value should be bound to TARGET
hit_except = False
try:
TARGET = value # TARGET gets the return value of enter(manager)
SUITE
...
Current Implementation
The current macro (with.clj#L45-L63) calls __enter__ but discards its return value:
(py-fn/call-attr ~varname "__enter__" nil) ; Return value is ignored
(try
(let [retval# (do ~@body)]
...
Expected Behavior
The bound variable should receive the return value of __enter__(), not the context manager itself:
(let [enter-result# (py-fn/call-attr ~varname "__enter__" nil)]
(try
(let [~varname enter-result# ; Rebind to __enter__'s return value
retval# (do ~@body)]
...
Why Current Tests Pass
The existing test in python_test.clj#L167 uses a WithObjClass where __enter__() returns None (implicitly), and the test methods are called on the original object. This masks the bug.
Real-World Example
A common Python pattern that fails with the current implementation:
with open('file.txt', 'r') as f:
content = f.read() # f should be the file object returned by __enter__
With the current macro, f would be bound to the unopened file path/manager rather than the file object returned by __enter__().
Next Steps
- Add test cases that verify this behavior (e.g., update
WithObjClass.__enter__to return a different object, or test with Python's built-in file context manager) - Update the macro to correctly bind the return value of
__enter__()
- Linguagem predominante
- Clojure
- Estrelas
- 1.2k
- Forks
- 74
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de clj-python/libpython-clj
-
upgrade to dtype-next 11.xxx Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 48/100
clj-python/libpython-clj#280 ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 38/100
clj-python/libpython-clj#275 · 5 comentários ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 25/100
clj-python/libpython-clj#271 · 1 comentário ·
-
"auto flush" tty optionally Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
clj-python/libpython-clj#270 · 1 comentário ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 42/100
clj-python/libpython-clj#269 · 3 comentários ·
Todas as issues de clj-python/libpython-clj
Issues semelhantes
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
-
.Team/Metabot Priority:P3
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
needs triage
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
scalar-labs/scalar-jepsen#222 · 1 comentário ·