This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2008年03月17日 16:45 by jyasskin, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| instancecheck.patch | amaury.forgeotdarc, 2008年06月30日 12:44 | patch for 2.6 | ||
| Messages (9) | |||
|---|---|---|---|
| msg63671 - (view) | Author: Jeffrey Yasskin (jyasskin) * (Python committer) | Date: 2008年03月17日 16:45 | |
>>> class Meta(type): ... def __instancecheck__(self, other): ... return False >>> isinstance(3, Meta) In 2.6, this results in: Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: maximum recursion depth exceeded while calling a Python object (That's a recursion in C, through PyObject_IsInstance and instancemethod_call) In 3.0, I get: Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __instancecheck__() takes exactly 2 positional arguments (1 given) |
|||
| msg66129 - (view) | Author: Pedro Werneck (werneck) | Date: 2008年05月02日 22:56 | |
In 3.0 it happens with any class. Just the cls argument missing on the call to instancecheck. |
|||
| msg66134 - (view) | Author: Pedro Werneck (werneck) | Date: 2008年05月03日 00:00 | |
Seems like that's the wrong usage and the PEP 3119 notices that it's hard to get the right semantics. To use it that way you need to define the methods as a classmethod(). http://www.python.org/dev/peps/pep-3119/#one-trick-ponies |
|||
| msg68532 - (view) | Author: Matias Gonzalez (mato2000) | Date: 2008年06月21日 18:34 | |
This is not a bug. Function __instancecheck__ should be a classmethod. >>> class Meta(type): ... @classmethod ... def __instancecheck__(self, other): ... return False ... >>> isinstance(3, Meta) False |
|||
| msg68985 - (view) | Author: Rafael Zanella (zanella) | Date: 2008年06月30日 01:17 | |
So..., could this issue be closed ? |
|||
| msg68987 - (view) | Author: Matias Gonzalez (mato2000) | Date: 2008年06月30日 02:42 | |
Yes, it should be. I don't have permissions to. |
|||
| msg68990 - (view) | Author: Jeffrey Yasskin (jyasskin) * (Python committer) | Date: 2008年06月30日 04:10 | |
I don't think so. It wouldn't be a bug if I wrote: >>> class Meta(type): ... def __instancecheck__(self, other): ... return True >>> isinstance(3, Meta) ... False but it is a bug that the isinstance call raises an exception. If recent builds no longer raise an exception, then the bug should be closed. You guys also seem to have missed that the examples in PEP 3119 in fact define __instancecheck__ as a normal method on a metaclass (which makes it a classmethod on classes derived from that metaclass) instead of as a classmethod on a metaclass. |
|||
| msg69005 - (view) | Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * (Python committer) | Date: 2008年06月30日 12:44 | |
I think the best is to ignore __instancecheck__ when "cls.__instancecheck__" is returned as an unbound method. In this case, we try "type(cls).__instancecheck__" instead. Here is a patch along this idea. I had to disable a test named "Evil", because in this case isinstance() simply falls back to the original algorithm. I don't know if this is applicable to 3.0: unbound methods don't exist any more. |
|||
| msg87718 - (view) | Author: Daniel Diniz (ajaksu2) * (Python triager) | Date: 2009年05月13日 22:28 | |
This now works correctly (returns False) in release26-maint, trunk and py3k. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:31 | admin | set | github: 46578 |
| 2009年05月13日 22:28:50 | ajaksu2 | set | status: open -> closed nosy: + ajaksu2 messages: + msg87718 resolution: out of date stage: resolved |
| 2008年06月30日 12:45:01 | amaury.forgeotdarc | set | files:
+ instancecheck.patch nosy: + amaury.forgeotdarc messages: + msg69005 |
| 2008年06月30日 04:10:28 | jyasskin | set | status: closed -> open resolution: not a bug -> (no value) messages: + msg68990 |
| 2008年06月30日 03:05:08 | benjamin.peterson | set | status: open -> closed resolution: not a bug |
| 2008年06月30日 02:42:30 | mato2000 | set | messages: + msg68987 |
| 2008年06月30日 01:17:58 | zanella | set | nosy:
+ zanella messages: + msg68985 |
| 2008年06月21日 18:34:13 | mato2000 | set | nosy:
+ mato2000 messages: + msg68532 |
| 2008年05月03日 00:00:41 | werneck | set | messages: + msg66134 |
| 2008年05月02日 23:20:49 | werneck | set | files: - issue2325.patch |
| 2008年05月02日 22:56:52 | werneck | set | files:
+ issue2325.patch keywords: + patch messages: + msg66129 nosy: + werneck |
| 2008年03月17日 16:45:06 | jyasskin | create | |