forbiddenfruit icon indicating copy to clipboard operation
forbiddenfruit copied to clipboard

Cursing dunder methods fails with: KeyError: '<method_to_curse>'

Open sgerodes opened this issue 3 years ago • 5 comments

curse(str, '__eq__', str.__ne__)

fails with: ...

  File ".../python3.6/site-packages/forbiddenfruit/__init__.py", line 425, in curse
    _curse_special(klass, attr, value)
  File ".../python3.6/site-packages/forbiddenfruit/__init__.py", line 332, in _curse_special
    tp_as_name, impl_method = override_dict[attr]
KeyError: '__eq__'

Also other dunder methods fails. e.g.:

curse(int, '__new__', <some other method>)
curse(float, '__dict__', <some other method>)

sgerodes avatar Jul 30 '21 08:07 sgerodes

I've had the same problems as well. I was messing around with dunders, and some raise KeyError where the attr definitely exists (I checked with __dict__ and similar things). However, this is peculiar:

image

It didn't raise an error. Do only some dunders not work?

Objectivitix avatar Aug 04 '21 01:08 Objectivitix

Also, other issues with the same format (cursing __something__ fails) seem to be the same problem, but just more specific (cursing __init__ fails, __iter__ fails, etc)

Objectivitix avatar Aug 04 '21 01:08 Objectivitix

__str__ and __new__ have been registered

radiantgurl avatar Sep 22 '21 18:09 radiantgurl

and my pull request will register a lot more You know what? Ill try to register them all.

radiantgurl avatar Sep 22 '21 18:09 radiantgurl

Another proof that cursing dunder methods fails.

I was trying to make numeric types callable, to implement implicit multiplication as it's known in some programming languages such as Julia.

from forbiddenfruit import curse, reverse

def __call__(self, other, /):
  return self * other

for cls in (int, float, complex):
  curse(cls, "__call__", __call__)

print(2(6))

This of course gave a SyntaxWarning that int objects are not callable, but also threw a KeyError: '__call__'.

C-Ezra-M avatar Nov 08 '22 10:11 C-Ezra-M