Хобрук: Ваш путь к мастерству в программировании

Почему Python ctype c_char_p возвращает разные значения в OSX и Windows?

Я больше узнаю о модуле Python ctypes и заметил странность, которую не знаю, как объяснить.

В Windows (Python 2.7.4) возвращается следующее:

>>> from ctypes import *
>>> c_char_p("Hello World!")
c_char_p('Hello World!')

В то время как в OSX (Python 2.7.2) возвращается следующее:

>>> from ctypes import *
>>> c_char_p("Hello World!")
c_char_p(4479401388)

Кроме того, в OSX c_char_p("Hello World!") возвращает другое числовое значение при каждом запуске.

Может ли кто-нибудь пролить свет на то, почему это может происходить?

Заранее спасибо.

16.07.2013

Ответы:


1

Глядя на исходник, __repr__ будет отображать содержимое строки только в том случае, если

  1. Он работает в Windows; а также
  2. IsBadStringPtr возвращает TRUE.

Они, вероятно, захотят показать строковое представление, если это возможно, поскольку это довольно полезная вещь, чтобы показать, но не привести к сбою вашей программы, если она указывает куда-то неожиданно. IsBadStringPtr существует только в Windows, что требует первой проверки. Честно говоря, я удивлен, что они использовали его, поскольку он явно помечен как устаревший и по уважительным причинам.

16.07.2013
  • Вы должны добавить, что адрес будет постоянным, если вы повторно используете одну и ту же строку Python, то есть s = b"Hello World"; c_char_p(s). Вот почему вы используете строку Python напрямую только с const char * (или эквивалентно char const *). Это же правило относится и к c_wchar_p. 16.07.2013
  • Спасибо, этот источник ясно показывает, что он написан для Windows. Посмотрев на ссылку, предоставленную eryksun, кажется, что она указывает на адрес строки в памяти (что было моим первоначальным предположением), но это до сих пор не исправлено. 16.07.2013
  • @eliteparakeet: патч Хеллера в выпуске 1701409 не исправляет отображение c_wchar_p. Он по-прежнему segfaults, если указатель неправильный на платформах, отличных от Windows. Обратите внимание, что для z_get и Z_get (строка 1459) они перенесли вызовы IsBadStringPtr в C. 16.07.2013
  • @eliteparakeet: Кроме того, как вы можете видеть в Z_get, в Windows неверный указатель приводит к тому, что repr c_wchar_p вызывает ValueError -- опять же, потому что исправление repr также не применялось к классу c_wchar_p. 16.07.2013
  • Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..