Re: c[:]()
- From: Steve Holden <steve@xxxxxxxxxxxxx>
- Date: Thu, 31 May 2007 16:37:43 -0400
Warren Stringer wrote:
c[:] holds many behaviors that change dynamically.I've absolutely no clue what that sentence means. If c[:] does
behave differently than c, then somebody's done something
seriously weird and probably needs to be slapped around for
felonious overriding.
I'm still a bit new at this, was wondering why c[:]() doesn't work, and
implicitly wondering why it *shouldn't* work.
So c[:]() -- or the more recent go(c)() -- executes all those
behaviors.
No it doesn't. See below.
Yes, dammit, but c[:]() *DOESN'T WORK* unless you have made some pretty crufty changes to the underlying object.
Oops meant to say do(c)(), not "go", which matches a prior post.
Still no clue.
This is very useful for many performers.What are "performers"?
Real people, like musicians, and their proxies in code that passes around
real-time events that may be rendered, recorded, and played back.
It isn't. The OP is projecting a wish for a function call on a list toThe real world example that I'm working one is a collaborativeI still don't see how c[:] is any different from c.
visual music performance. So c can contain wrapped MIDI events
or sequencer behaviors. c may get passed to a scheduler to
execute those events, or c may get passed to a pickler to
persist the performance.
be interpreted as a call on each member of the list with the same
arguments. The all-members slice notation is a complete red herring.
Just looked up "red herring wiki" hope I wasn't being misleading -- at least
not intentionally. c[:] is the simplest case for a broad range of behaviors.
Perhaps, I should have said c[selector()]() ??? but, no, that makes the
question more complex ... still
It would require a pretty fundamental re-think to give such a construct
sensible and consistent semantics, I think.
What do you mean?
If c[:]() works, the so does this, using real world names
orchestra[:].pickle()
orchestra[conductor()].sequence()
Though, I'm already starting to prefer:
do(orchestra).pickle() do(orchestra(conductor)).sequence()
Perhaps, this is what you mean by "sensible and consistent semantics"This is what I'm having difficulty understanding. You said, in your original post (which, by the way, hijacked another thread about something completely different):
I just read Alex Martelli's post in the "rats! Varargs" thread about how
list and tupples are implemented. I want to understand implementation before
suggesting changes. Maybe c[:]() isn't so simple to fix, after all?
I want to call every object in a tupple, like so:[By the way, that's "tuple", not "tupple"]
#------------------------------------------
def a: print 'a'
def b: print 'b'
c = (a,b)
TypeError: 'tupple' object is not callable>>>c[:]() # i wanna
a>>>c[0]() # expecteda>>>c[:][0] # huh?
This is what I just don't believe. And, of course, the use of "tupple" above tells us that this *wasn't" just copied and pasted from an interactive session.
This is also clearly made up.a>>> [i() for i in c] # too long and ...huh?
b
[None,None]
#------------------------------------------
In a later email you say:
why does c[:][0]() work but c[:]() does not?
The reason for this is that c[:][0] is a function, a single item from a tuple of functions. c[:], however, is a tuple of functions, and cannot be called as a function itself. No matter how much you would like it to be. Python's chief virtue is obviousness, and this behavior would be very non-obvious. You also don't explain when Python should do if you happen to have something other than a function (say a string or a floating-point number) in the tuple.
You also said:
Why does c[0]() has exactly the same results as c[:][0]() ?
The reason for this is that c is exactly the same as c[:]. The slicing notation "[:]" tells the interpreter to use a tuple consisting of everything in the tuple to which it's applied. Since the interpreter knows that tuples are immutable (can't be changed), it just uses the same tuple -- since the immutability there's no way that a difference could arise between the tuple and a copy of the tuple, Python doesn't bother to make a copy.
This behavior is *not* observed with lists, because lists are mutable.
I realise you are trying to find ways to make Python more productive for you, and there's nothing wrong with that. But consider the following, which IS copied and pasted:
>>> def a():
.... print "A"
....
>>> def b():
.... print "B"
....
>>> c = (a, b)
>>> c
(<function a at 0x7ff4f764>, <function b at 0x7ff4f64c>)
>>> c[:]
(<function a at 0x7ff4f764>, <function b at 0x7ff4f64c>)
>>> c[0]()
A
>>> c[1]()
B
>>> c()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
>>> c[:]()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
>>>
I think the fundamental mistake you have made is to convince yourself that
c[:]()
is legal Python. It isn't, it never has been.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
------------------ Asciimercial ---------------------
Get on the web: Blog, lens and tag your way to fame!!
holdenweb.blogspot.com squidoo.com/pythonology
tagged items: del.icio.us/steve.holden/python
All these services currently offer free registration!
-------------- Thank You for Reading ----------------
.
- References:
- "is" and ==
- From: BlueJ774
- RE: c[:]()
- From: Warren Stringer
- Re: c[:]()
- From: Dustan
- RE: c[:]()
- From: Warren Stringer
- Re: c[:]()
- From: Grant Edwards
- RE: c[:]()
- From: Warren Stringer
- Re: c[:]()
- From: Grant Edwards
- RE: c[:]()
- From: Warren Stringer
- Re: c[:]()
- From: Grant Edwards
- "is" and ==
- Prev by Date: Re: Adding tuples to a dictionary
- Next by Date: Re: strange PyLint configuration
- Previous by thread: RE: c[:]()
- Next by thread: Re: c[:]()
- Index(es):
Relevant Pages
|