Async functools.partial calls return an unawaited coroutine
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 72/100
Línea de trabajo
Empieza en _CallAndUpdateTrace, donde la comprobación de corrutinas inspecciona partial.__call__ en lugar de la función envuelta. Reproduce con el fragmento del issue, que envuelve un greet asíncrono en functools.partial y llama a fire.Fire(..., command=[]). Está terminado cuando el partial devuelve la cadena awaited Rio!, los partial síncronos siguen comportándose como antes y las pruebas de regresión cubren ambos casos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
On current master (716bbc23d7eca949fdb682172283c8d18f742cb6), passing an async function to Fire works, but wrapping it in functools.partial returns the coroutine without running it:
import functools
import inspect
import fire
async def greet(name, suffix="!"):
return name + suffix
result = fire.Fire(functools.partial(greet, "Rio"), command=[])
print(type(result).__name__) # coroutine, rather than str
if inspect.iscoroutine(result):
result.close()
Expected: the command prints Rio! and returns that string. Instead it displays help for the coroutine object and never executes the async function.
_CallAndUpdateTrace inspects partial.__call__, which is not recognized as a coroutine function, rather than the partial itself. Ordinary async callable objects are not affected.
I plan to send a small fix that unwraps the partial only when detecting coroutines, leaving argument parsing unchanged. Regression coverage will include synchronous and asynchronous partials. This does not change event-loop handling or introduce a new async execution mode.
- Lenguaje dominante
- Python
- Estrellas
- 28.2k
- Forks
- 1.5k
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de google/python-fire
-
WrappedJoin adds an empty line before an oversized first itemPosiblemente ocupada @GreedyC la tomó hace 10 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
google/python-fire#705 ·
-
Brace-based template arguments crash literal parsing with TypeErrorPosiblemente ocupada @codewithfourtix la tomó hace 11 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
google/python-fire#703 ·
-
Test suite fails on Windows: unescaped path regex in testArgPassing, NamedTemporaryFile reopen in testFileNameFirePosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
google/python-fire#693 ·
-
Mio ❤️Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 1/100
google/python-fire#709 · 2 comentarios ·
-
2083Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 5/100
google/python-fire#708 ·
Todos los issues de google/python-fire
Issues similares
-
area: agents area: docs good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
openapi/gknowledge#23 ·
-
get() for StrEnumPosiblemente ocupada @FeJo5952 la tomó hoy. Abiertogood first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
collective/icalendar#1921 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Improvement Python Spans
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
getsentry/sentry-python#7994 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
alphagov/notifications-api#5004 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
equinor/radix-flux#3922 ·
Los mantenedores suelen responder en 1 día