2014-12-29 3 views
13

короткая версияЧто такое PyObject в Python?

Недавно я наткнулся на некоторый код Python, в котором тип возвращаемого значения для функции был указан в качестве PyObject в the documentation. Что такое PyObject?

Подробная версия

Я не C/C++ программист, но, когда я столкнулся с PyObject в документации, связанной выше, Google научил меня, что PyObject является объектом Python, как определено с использованием Python/C API , В частности, API documentation определяет PyObject следующим образом:

Все типы объектов являются расширениями этого типа. Это тип, который содержит информацию, на которую Python должен обрабатывать указатель на объект как объект. В обычной сборке «release» он содержит только счет ссылки объекта и указатель на соответствующий тип . Он соответствует полям, определяемым расширением макроса Py12b.

Честно говоря, я не совсем понимаю, или отвечает ли это мой основной вопрос, но это не заставляет меня думать, что это, очевидно, не так просто думать о PyObject как объект Python, полной остановки. С другой стороны, возможно, чтобы технически считать PyObject, тип должен был быть создан как расширение стандартного Python с использованием API Python/C. Например, является целым числом PyObject?

Потенциально соответствующие ссылки

http://docs.scipy.org/doc/numpy/reference/c-api.types-and-structures.html

+1

Вы можете понять, как тип PyObject C используется, например, в определении C строки Python здесь. Https://github.com/python-git/python/blob/master/Include/stringobject.h – Jivan

+0

Также обратите внимание, что, насколько мне известно, Python является чистым C, а не C++ – Jivan

+0

@ Jivan Я думал, что расширения могут работать с ними, но я могу удалить тег C++, если это неправильно ... – neuronet

ответ

9

Каждое значение, которое можно потрогать в Python находится в C. PyObject Это включает в себя списки, словари, сокеты, файлы, целые числа, строки, функции, классы, вам назови это. Если вы можете коснуться его в Python, это PyObject в C.

+0

Я вижу две интерпретации, а затем: если кто-то задает PyObject в качестве входного параметра в своей документации, с одной стороны, это в основном означает «Все, что вы хотите может быть входом '. С другой стороны, если это технически PyObject * в C *, не так ли ошибочно назвать его входным параметром * в Python *? Обратите внимание, что документация находится здесь: http://srinikom.github.io/pyside-docs/PySide/QtCore/QAbstractItemModel.html#PySide.QtCore.PySide.QtCore.QAbstractItemModel.createIndex – neuronet

+0

Я только что заметил, что PyQt, альтернативный Python Qt привязка, фактически вызывает тот же параметр 'object', а не' PyObject': http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html # createIndex Кроме того, на практике, используя эту функцию, мы кормим ее запущенными объектами Python, определенно не ожидая, что вход явно был создан через расширение Python с использованием API. – neuronet

+2

@neuronet: Да, вероятно, ошибка заключается в том, что что-то является документом PyObject в документации Python, но несколько понятно, почему он может существовать там, так как я считаю, что PySide частично автоматически генерируется, и этот генератор кода может не иметь специального -cased «PyObject» не должен появляться в документации Python ». И «PyObject» - это любой объект, который может быть затронут в Python, * даже если он был определен в Python *. Он не должен определяться расширением. Говоря, что он берет «PyObject», он говорит, что принимает любое старое значение. – icktoofay

2

A PyObject - это фактически просто объект Python на уровне C. А так как целые числа в Python являются объектами, они также являются PyObject s. Неважно, было ли это написано на Python или C, это PyObject на уровне C независимо.

+0

, то у меня есть вопрос, который я задал icktoofay: если PyObject определяется только на уровне C, означает ли это, что технически ошибка указывать его как тип ввода для функции * на уровне Python *? Например, если ввод в функцию Python просто вводится как * any * или какой-либо другой всеобъемлющий термин? – neuronet

+0

@neuronet: Аргументы функций Python являются нетипизированными. Аргументы реализации C-поддержки функции Python не могут быть отписаны. –

+0

Я думаю, что я понимаю: они являются нетипизированными в том, что тип явно не объявлен в списке параметров. Тем не менее, они иногда ожидают определенные типы (т. Е. Существуют «TypeErrors» в Python). См. Ссылки в комментариях к icktoofay, чтобы увидеть документацию, о которой я говорил, и описание ожидаемых типов входных параметров. Кроме того, если вы введете 'a = str', это хорошо в Python. Но попробуйте ввести 'a = PyObject'. Вы получаете NameError. Могу ли я сказать следующее: 'PyObject' - это c-тип, используемый c для определения класса Python. Но это не стандартный тип * внутри Python *. – neuronet