Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #50448
| References | <n6n2ba-ubg.ln1@satorlaser.homedns.org> |
|---|---|
| Date | 2013-07-11 10:28 -0400 |
| Subject | Re: Callable or not callable, that is the question! |
| From | Jason Swails <jason.swails@gmail.com> |
| Newsgroups | comp.lang.python |
| Message-ID | <mailman.4587.1373552924.3114.python-list@python.org> (permalink) |
[Multipart message — attachments visible in raw view] - view raw
On Thu, Jul 11, 2013 at 9:05 AM, Ulrich Eckhardt < ulrich.eckhardt@dominolaser.com> wrote: > Hello! > > I just stumbled over a case where Python (2.7 and 3.3 on MS Windows) fail > to detect that an object is a function, using the callable() builtin > function. Investigating, I found out that the object was indeed not > callable, but in a way that was very unexpected to me: > > class X: > @staticmethod > def example(): > pass > test1 = example > test2 = [example,] > > X.example() # OK > X.test1() # OK > X.test2[0]() # TypeError: 'staticmethod' object is not callable > Interestingly, you can actually use this approach to 'fake' staticmethod before staticmethod was even introduced. By accessing example from inside the test2 class attribute list, there is no instance bound to that method (even if an instance was used to access it). Using Python 3.3: Python 3.3.2 (default, Jun 3 2013, 08:29:09) [GCC 4.5.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> class X: ... def example(): pass ... test = example, ... >>> X.test[0]() >>> Using Python 2.0 (pre-staticmethod): Python 2.0.1 (#1, Aug 28 2012, 20:25:41) [GCC 4.5.3] on linux3 Type "copyright", "credits" or "license" for more information. >>> class X: ... def example(): pass ... test = example, ... >>> X.test[0]() >>> staticmethod Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: There is no variable named 'staticmethod' Once you change test into an instance attribute, you get back to the expected behavior Python 3.3.2 (default, Jun 3 2013, 08:29:09) [GCC 4.5.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> class X: ... def example(self): pass ... test = example, ... >>> inst = X() >>> inst.example() >>> inst.test[0]() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: example() missing 1 required positional argument: 'self' >>> inst.test = inst.example, >>> inst.test[0]() >>> All the best, Jason
Back to comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Callable or not callable, that is the question! Ulrich Eckhardt <ulrich.eckhardt@dominolaser.com> - 2013-07-11 15:05 +0200
Re: Callable or not callable, that is the question! Peter Otten <__peter__@web.de> - 2013-07-11 16:11 +0200
Re: Callable or not callable, that is the question! Ulrich Eckhardt <ulrich.eckhardt@dominolaser.com> - 2013-07-12 08:41 +0200
Re: Callable or not callable, that is the question! Duncan Booth <duncan.booth@invalid.invalid> - 2013-07-12 07:36 +0000
Re: Callable or not callable, that is the question! Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-07-12 09:49 +0000
Re: Callable or not callable, that is the question! Peter Otten <__peter__@web.de> - 2013-07-12 12:36 +0200
Re: Callable or not callable, that is the question! Jason Swails <jason.swails@gmail.com> - 2013-07-11 10:28 -0400
Re: Callable or not callable, that is the question! Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-07-12 02:12 +0000
Re: Callable or not callable, that is the question! Ian Kelly <ian.g.kelly@gmail.com> - 2013-07-12 01:11 -0600
csiph-web