Python: RecursionError

Каждый раз, запуская вот такой код:

from _ctypes import FUNCFLAG_STDCALL
from _ctypes import CFuncPtr
from _ctypes import LoadLibrary
from _ctypes import Structure, pointer
from _ctypes import _SimpleCData

class c_long(_SimpleCData):
    _type_ = "l"
class c_int(_SimpleCData):
    _type_ = 'i'

class WinDLL(object):
    def __init__(self, name):
        import nt
        LibraryLoader = LoadLibrary(name, nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)
        class WinDLL_Func(CFuncPtr):
            _flags_ = FUNCFLAG_STDCALL
            _restype_ = c_int
        self.WinDLL_Func = WinDLL_Func
    def __getattr__(self, name):
        return self.WinDLL_Func((name, self))

class POINT(Structure):
    _fields_ = [('x', c_long),
                ('y', c_long)]
pointerpoint = pointer(POINT())
user32 = WinDLL('user32')
user32.GetCursorPos(pointerpoint)
print('({}, {})'.format(pointerpoint[0].x, pointerpoint[0].y))

Получаю ошибку

Traceback (most recent call last):
  File "C:\Users\user\Desktop\PyG.py", line 25, in <module>
    user32.GetCursorPos(pointer(POINT()))
  File "C:\Users\user\Desktop\PyG.py", line 18, in __getattr__
    return self.WinDLL_Func((name, self))
  File "C:\Users\user\Desktop\PyG.py", line 18, in __getattr__
    return self.WinDLL_Func((name, self))
  File "C:\Users\user\Desktop\PyG.py", line 18, in __getattr__
    return self.WinDLL_Func((name, self))
  [Previous line repeated 510 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

Скажите пожалуйста, как исправить данную ошибку?


Ответы (2 шт):

Автор решения: Victor VosMottor

Понятия не имею, что делает этот код...

Но вот такое например решение (только будьте острожны, не делайте LIMIT слишком большим!):

import sys
LIMIT = 1000
sys.setrecursionlimit(LIMIT) # or more than 1000...

Я на линуксе, так что попробовать не могу...

И кстати если это по сути функция без условия выхода типа:

def f():
    ...
    f()

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

→ Ссылка
Автор решения: Aleksey Bogomagkov

Я забыл про ещё одну глобальную переменную - _handle.

LibraryLoader = LoadLibrary(name, nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)

Нужно заменить на

self._handle = LoadLibrary(name, nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)

В результате получается, то что я и задумал: DLL библиотека user32 передаёт данные о позиции курсора в указатель, а затем данные выводятся на экран

→ Ссылка