Comments (1)
Python 3.12 finally added inspect.markcoroutinefunction
to solve this.
async def foo():
...
inspect.markcoroutinefunction(foo)
Of course you could wrap decorator
if you don't want to do this manually for every decorated async
function.
Background
Python allows creating callables which are not coroutines (not defined with async
) but still return awaitables (work with await
).
So everyone who uses inspect.iscoroutinefunction
to decide whether to use await
is technically wrong (but Python itself has at least half the blame here - the need for something like inspect.markcoroutinefunction
has been blatantly obvious for at least five years now, and arguably should've been obvious when first designing the async
/await
language addition back in 3.5).
inspect.iscoroutinefunction
is a half check. If it returns True
we know we should use await
, but if it returns False
we haven't actually disproven if we should use await
.
So instead of
if inspect.iscoroutinefunction(f):
result = await f(...) # correct
else:
result = f(...) # could be wrong, f might return an awaitable
the universally correct solution is
result = f(...)
if inspect.isawaitable(result):
result = await result
And if we're in a wrapper that needs to support both sync and async functions, you just return whatever f
returned, which makes you transparent w.r.t. to whether an await
is needed on your return value:
return f(...)
I infer decorator
is using that last method, which is technically the most correct thing to do, but sadly it just pushes this obscure edge-case further up the call-stack, making it everyone else's problem.
So decorator
could be written to progressively enhance: try importing inspect.markcoroutinefunction
- if it's not available just don't use it, but if it is, check the wrapped callable with inspect.iscoroutinefunction
and mark the wrapper to match.
from decorator.
Related Issues (20)
- 5.0.9: sphinx 4.x warnings HOT 3
- pylint warning W1113: keyword-arg-before-vararg HOT 1
- Regression in 5.1.0 - decorator.contextmanager no longer compat with contextlib.contextmanager HOT 4
- `FunctionMaker.create()` fails when given a function definition with a return type annotation. HOT 1
- Functionmaker.create (from doc example) fails with kwarg-only functions HOT 6
- `FunctionMaker.create` raises unexpected SyntaxError when return is present as substring for async function
- How to make `@decorator` with other decorators? HOT 3
- TypeError: missing 1 required positional argument HOT 1
- <=3.4.2 can't be installed with modern setuptools HOT 2
- Continuous fuzzing by way of OSS-Fuzz
- compatibility issue with kwargs HOT 2
- Not preserving low level signature metadada HOT 1
- decorator whether to support decorator partial functions?
- Confusion about license using HOT 1
- Making __name__ optional attribute of decorated-function if underlying function is missing it. HOT 3
- Compatibility with Python 3.12 - RuntimeError: There is no current event loop in thread 'MainThread'.
- Unable to pull 4.4.2 from the repo only pulls in 4.2.1 HOT 1
- [BUG] kwargs are not respected HOT 3
- Create SECURITY.md
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from decorator.