Пока я сидел на грибе и размышлял о тонкостях написания функции для реализации алгоритма искажения имени Python, мне в голову пришла невероятно лучшая идея. Почему бы не использовать рецепт, уже встроенный в язык, для достижения такой цели? Поэтому я вытащил ctypes
из своей сумки, чтобы помочь с делом, и казнил ctypes.pythonapi._Py_Mangle('Demo', '__test')
. И вот, из ниоткуда появилась ошибка, говорящая OSError: exception: access violation reading 0x00000A65646F00A8
, и больше не стал объяснять загадку.
Полное взаимодействие с интерпретатором выглядит следующим образом:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import ctypes
>>> ctypes.pythonapi._Py_Mangle('Demo', '__test')
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
ctypes.pythonapi._Py_Mangle('Demo', '__test')
OSError: exception: access violation reading 0x00000A65646F00A8
Кто-нибудь знает, что нужно изменить, чтобы успешно вызвать функцию искажения?
pythonapi
является экземпляромPyDLL
, который является подклассомCDLL
, который устанавливает флаг для указателей функций, чтобы предотвратить освобождение глобальной блокировки интерпретатора (GIL) во время вызова. В противном случае преобразования аргументов по умолчанию и тип результата такие же, какCDLL
. Таким образом, вам нужно определить типы:ctypes.pythonapi._Py_Mangle.argtypes = [ctypes.py_object, ctypes.py_object];
ctypes.pythonapi._Py_Mangle.restype = ctypes.py_object
. - person Eryk Sun   schedule 13.01.2015sys.name_mangle
илиinspect.name_mangle
, чтобы сделать это за вас. - person Eryk Sun   schedule 13.01.2015python-ideas
обсуждение? - person Kevin   schedule 13.01.2015