Yukarıdaki çözümler, coroutine işlevini ilettiğinizde basit durumlar için çalışacaktır. Bazı durumlarda, coroutine işlevi gibi davranan algılanan nesne işlevini geçmek isteyebilirsiniz, ancak coroutine işlevi değildir. İki örnek Future sınıfı veya Gelecek benzeri nesne sınıfıdır (sınıf implements__await__
sihirli yöntemidir). Bu durumda iscoroutinefunction
, False
'u döndürecek, ihtiyacınız olmayan şey.
Bu çağrılabilir geri arama olmayan işlevi geçirerek ile uyumsuz olmayan örnek üzerinde anlaşılması kolay:
Geri zaman uyumsuz dünyaya
class SmartCallback:
def __init__(self):
print('SmartCallback is not function, but can be used as function')
await callCallback(SmartCallback) # Should work, right?
benzer bir durum: öyle değil çözmek için
class AsyncSmartCallback:
def __await__(self):
return self._coro().__await__()
async def _coro(self):
print('AsyncSmartCallback is not coroutine function, but can be used as coroutine function')
await asyncio.sleep(1)
await callCallback(AsyncSmartCallback) # Should work, but oops! iscoroutinefunction(AsyncSmartCallback) == False
Way iscoroutine
veya iscoroutinefunction
kullanmak için, ancak bunun yerine inspect.isawaitable
kullanın. Hazır nesne ile çalışır, bu yüzden önce onu oluşturmanız gerekir. Bu daha evrensel olduğunu
async def callCallback(cb, arg):
if callable(cb):
res = cb() # here's result of regular func or awaitable
if inspect.isawaitable(res):
res = await res # await if awaitable
return res # return final result
else:
raise ValueError('cb is not callable')
(ve ben mantıken doğru eminim) çözümü: Diğer bir deyişle, ben tavsiye ediyorum çözüm kullanmak.
Ama ... 'True/False' 0 'ile bölündü! : O – Shadow