Redefining methods on modules causes a segfault
thedrow opened this issue · 4 comments
Python 2.7.4 (default, Apr 19 2013, 18:28:01)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from forbiddenfruit import curse
>>> curse(__builtins__, round, lambda x, y: y)
Segmentation fault (core dumped)
This is not very surprising but there should be a way to hack around it. At least I hope so.
P.S.
This project is great. I haven't found the time to do it myself but I wanted to do so forever. Thank you very much.
Hi, thank you so much for your report!
The problem here is that the curses
function is not prepared to deal with modules. We would see exactly the same problem if you were trying to curse anything on os
for example.
Probably, raising a TypeError
saying that modules are not welcome would be enough, since you can still patch them without cursing them. Forbidden Fruit actually uses this technique to provide the hide_from_dir
parameter in the curse
function: https://github.com/clarete/forbiddenfruit/blob/master/forbiddenfruit/__init__.py#L64
What do you think?
My preference would be for the simplest API possible, so a caller doesn't need different behavior to change a module's attributes or a class's. That is, to have curse()
check wether the given klass
is really a module, and if so, patching it the simpler way hide_from_dir
does. One-stop shopping!
That makes a lot of sense and I have the tests! :)
But how do we make sure this is done globally?