2016-06-25 2 views
0

Я работаю над Python 3.5.1, и я хочу, чтобы узнать, была ли функция возвращена как объект coroutine, но я не могу найти, где определен тип сопрограммы, а в последнее время я использовал приведенный ниже фрагмент для получения типа путем создания экземпляра сопрограммы с функцией.Где определяется тип сопрограммы Python?

async def _f(): 
    pass 
COROUTINE_TYPE = type(_f()) 

Там должен быть лучший способ сделать это, на мой вопрос, где этот тип определен так, что я могу использовать его непосредственно?

ответ

1

Вероятно, лучший способ получить доступ к типу сопрограммы осуществляется через types модуль:

import types 

types.CoroutineType # here it is 

Это на самом деле не где тип сопрограммный является определенной - types.py делает почти то же самое, что вы делаете, чтобы получить на нем - но это стандартный уровень на уровне Python до доступ типа.

Если вы хотите увидеть фактическое определение типа, то в Include/genobject.h и Objects/genobject.c. Ищите части, которые говорят PyCoroWhatever или coro_whatever.

+0

Там мы идем! По какой-то причине я не думал попробовать «types.CoroutineType», я уже пробовал «types.Coroutine», а затем сдался, когда мне не было. Благодаря! –

+0

@Oasiscircle: В следующий раз попробуйте 'dir (types)', чтобы получить список всего в модуле (или 'help (types)' для более полезной, более форматированной информации, но 'help (types)' в этом случай не говорит вам, что вы хотите знать). –

+0

@ DietrichEpp Ха-ха не беспокойтесь, я знаю о 'dir()' и 'help()', я программировал Python профессионально некоторое время. ;) –

1

Лучший способ узнать, является ли функция сопрограммой с asyncio.iscoroutinefunction.

asyncio.iscoroutinefunction(some_func) 
+0

Спасибо! Это происходит, чтобы решить мою текущую проблему, но на самом деле не отвечает на вопрос напрямую, потому что если я хочу знать, где определен тип сопрограммы, а не как проверить функцию, если она вернет сопрограмму. –

+0

'asyncio.iscoroutine'' 'isinstance (obj, _COROUTINE_TYPES)', где TYPES определен в 'asyncio.coroutines.py' как 2 или 3 типа. – hpaulj

0

тип сопрограммная Пайтона определен в _collections_abc, который импортируется в collections.abc, которая сама по себе импортируемого в asyncio.coroutines.

Не знаете, как это поможет вам больше, чем ответ @ dirn, хотя (как это сказать, является ли функция сопрограммой).

+0

@ Oasiscircle: На самом деле это не тип сопрограммы. Это ABC для типов, которые реализуют интерфейс, соответствующий интерфейсу сопрограмм. Это похоже на то, как 'collections.abc.Set' не является установленным типом. – user2357112

+0

@ user2357112 В основном я искал что-то для использования с 'isinstance', и интерфейс соответствует этому счету. Если есть место, где объект coroutine реализует этот интерфейс, я думаю, что это было бы более уместным. –

Смежные вопросы