Why does Python give an error when I try to do this:
>>len(object=[1,2])
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
len(object=[1,2])
TypeError: len() takes no keyword arguments
but not when I use a "normal" function:
>>def my_len(object):
return len(object)
>>my_len(object=[1,2])
2 10 5065
Armando Serrano Lombillo <ar******@gmail.comwrote:
Why does Python give an error when I try to do this:
>>>len(object=[1,2])
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
len(object=[1,2])
TypeError: len() takes no keyword arguments
but not when I use a "normal" function:
>>>def my_len(object):
return len(object)
>>>my_len(object=[1,2])
2
At the C level there are several options for how you define a function
callable from Python. The most general form is
METH_VARARGS|METH_KEYWORDS which accepts both a tuple of arguments and a
dictionary of keyword arguments. These then have to be parsed to find
the actual arguments.
Many of the builtin functions use only METH_VARARGS which means they
don't support keyword arguments. "len" is even simpler and uses an
option METH_O which means it gets a single object as an argument. This
keeps the code very simple and may also make a slight difference to
performance.
I don't know if the reason that most builtin functions don't accept
keywords is just historical (someone would have to go through a lot of
code and add keyword argument names) or if there really is any
measurable performance difference to not using the METH_KEYWORDS option.
Being able to write less C code may be the main factor.
Armando Serrano Lombillo a écrit :
Why does Python give an error when I try to do this:
>>>len(object=[1,2])
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
len(object=[1,2])
TypeError: len() takes no keyword arguments
but not when I use a "normal" function:
>>>def my_len(object):
return len(object)
>>>my_len(object=[1,2])
2
In the second case, the name of the argument *is* 'object'. Which is not
the case for the builtin len (which, fwiw, has type
'builtin_function_or_method', not 'function', so inspect.getargspec
couldn't tell me more).
<ot>
While we're at it, you should avoid using builtin's names for
identifiers - here, using 'object' as the arg name shadows the builtin
'object' class).
</ot>
On Mon, 29 Oct 2007 13:52:04 +0000, Armando Serrano Lombillo wrote:
Why does Python give an error when I try to do this:
>>>len(object=[1,2])
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
len(object=[1,2])
TypeError: len() takes no keyword arguments
but not when I use a "normal" function:
>>>def my_len(object):
return len(object)
>>>my_len(object=[1,2])
2
Because len() takes no keyword arguments, just like it says, but my_len()
is written so it DOES take a keyword argument.
When you call a function foo(object=[1,2]) you are instructing Python to
bind the value [1,2] to the keyword argument "object". But if the
function doesn't have a keyword argument named "object" then it will fail
immediately. Since len() doesn't have ANY keyword arguments, naturally it
doesn't have one called "object".
You can see the same effect here:
>>def my_len2(*args):
.... return len(arg[0])
....
>>my_len2(object=[1,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_len2() got an unexpected keyword argument 'object'
Apart from the error message being slightly different, many (most? all?)
of the built in functions are like my_len2().
You may be thinking that keyword arguments are the equivalent of this:
object=[1,2]
len(object)
That is not the case. They are not at all equivalent.
--
Steven.
Bruno Desthuilliers <br********************@wtf.websiteburo.oops.com >
wrote:
In the second case, the name of the argument *is* 'object'. Which is not
the case for the builtin len (which, fwiw, has type
'builtin_function_or_method', not 'function', so inspect.getargspec
couldn't tell me more).
<ot>
While we're at it, you should avoid using builtin's names for
identifiers - here, using 'object' as the arg name shadows the builtin
'object' class). </ot>
I think you are being a little bit unfair here: help(len) says:
len(...)
len(object) -integer
Return the number of items of a sequence or mapping.
which implies that the argument to len has the name 'object' (although in
fact it doesn't have a name). The OP was simply asking about the difference
in calling conventions, not proposing to write code using 'object' as the
argument name.
><ot>
>While we're at it, you should avoid using builtin's names for identifiers - here, using 'object' as the arg name shadows the builtin 'object' class). </ot>
I think you are being a little bit unfair here: help(len) says:
len(...)
len(object) -integer
Return the number of items of a sequence or mapping.
which implies that the argument to len has the name 'object' (although in
fact it doesn't have a name).
And to confound matters even further for the uninitiated, http://docs.python.org/lib/built-in-funcs.html#l2h-45
says that it's "len(s)" instead (but "len(s=[])" doesn't work either)
-tkc
On Oct 29, 3:10 pm, Duncan Booth <duncan.bo...@invalid.invalidwrote:
Armando Serrano Lombillo <arser...@gmail.comwrote:
Why does Python give an error when I try to do this:
>>len(object=[1,2])
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
len(object=[1,2])
TypeError: len() takes no keyword arguments
but not when I use a "normal" function:
>>def my_len(object):
return len(object)
>>my_len(object=[1,2])
2
At the C level there are several options for how you define a function
callable from Python. The most general form is
METH_VARARGS|METH_KEYWORDS which accepts both a tuple of arguments and a
dictionary of keyword arguments. These then have to be parsed to find
the actual arguments.
Many of the builtin functions use only METH_VARARGS which means they
don't support keyword arguments. "len" is even simpler and uses an
option METH_O which means it gets a single object as an argument. This
keeps the code very simple and may also make a slight difference to
performance.
I don't know if the reason that most builtin functions don't accept
keywords is just historical (someone would have to go through a lot of
code and add keyword argument names) or if there really is any
measurable performance difference to not using the METH_KEYWORDS option.
Being able to write less C code may be the main factor.
Ok. I was suspecting something like this. Performance issues aside, I
think it would be a good idea if built-in functions behaved exactly
the same as normal functions.
BTW, I came into this problem when trying to use functools.partial:
import functools
getattrF = functools.partial(getattr, default=False)
which I think should have worked if getattr behaved as normal
functions do.
In the end I did:
def getattrF(object, name):
return getattr(object, name, False)
Any better idea?
On Oct 29, 3:20 pm, Bruno Desthuilliers <bruno.
42.desthuilli...@wtf.websiteburo.oops.comwrote:
Armando Serrano Lombillo a écrit :
Why does Python give an error when I try to do this:
>>len(object=[1,2])
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
len(object=[1,2])
TypeError: len() takes no keyword arguments
but not when I use a "normal" function:
>>def my_len(object):
return len(object)
>>my_len(object=[1,2])
2
In the second case, the name of the argument *is* 'object'. Which is not
the case for the builtin len (which, fwiw, has type
'builtin_function_or_method', not 'function', so inspect.getargspec
couldn't tell me more).
so that's the point, built-in functions don't behave as normal
functions.
<ot>
While we're at it, you should avoid using builtin's names for
identifiers - here, using 'object' as the arg name shadows the builtin
'object' class).
</ot>
As Duncan points out, I was using the name object because it's what
you get when you type help(len) (or in the calltips, or in). Anyway, I
don't think there's any harm in overriding a builtin name in such a
small scope (the object=[1,2] won't shadow the built-in object outside
of the function).
On Mon, 29 Oct 2007 08:34:58 -0700, Armando Serrano Lombillo wrote:
On Oct 29, 3:10 pm, Duncan Booth <duncan.bo...@invalid.invalidwrote:
>> I don't know if the reason that most builtin functions don't accept keywords is just historical (someone would have to go through a lot of code and add keyword argument names) or if there really is any measurable performance difference to not using the METH_KEYWORDS option. Being able to write less C code may be the main factor.
Ok. I was suspecting something like this. Performance issues aside, I
think it would be a good idea if built-in functions behaved exactly
the same as normal functions.
As Steven D'Aprano showed they behave like normal functions. Even pure
Python functions can have arguments without names:
def spam(*args):
pass
Ciao,
Marc 'BlackJack' Rintsch
"Tim Chase" <py*********@tim.thechases.com>
I think you are being a little bit unfair here: help(len) says:
len(...)
len(object) -integer
Return the number of items of a sequence or mapping.
which implies that the argument to len has the name 'object' (although in
fact it doesn't have a name).
And to confound matters even further for the uninitiated,
http://docs.python.org/lib/built-in-funcs.html#l2h-45
says that it's "len(s)" instead (but "len(s=[])" doesn't work either)
Looks like a gotcha to me - its the difference between a keyword
(master = 42) and an assignment (s='I am a string')
You just can't do that - how is the parser supposed to know that
the second one is an assignment and not a keyword?
len([]) should work, though.
- Hendrik
Armando Serrano Lombillo a écrit :
On Oct 29, 3:20 pm, Bruno Desthuilliers <bruno.
42.desthuilli...@wtf.websiteburo.oops.comwrote:
>Armando Serrano Lombillo a écrit :
>>Why does Python give an error when I try to do this: >len(object=[1,2]) Traceback (most recent call last): File "<pyshell#40>", line 1, in <module> len(object=[1,2]) TypeError: len() takes no keyword arguments but not when I use a "normal" function: >def my_len(object): return len(object) >my_len(object=[1,2]) 2
In the second case, the name of the argument *is* 'object'. Which is not the case for the builtin len (which, fwiw, has type 'builtin_function_or_method', not 'function', so inspect.getargspec couldn't tell me more).
so that's the point, built-in functions don't behave as normal
functions.
><ot> While we're at it, you should avoid using builtin's names for identifiers - here, using 'object' as the arg name shadows the builtin 'object' class). </ot>
As Duncan points out, I was using the name object because it's what
you get when you type help(len)
That what I thought. But anyway, you're not the only person reading this
newsgroup, and there are a couple gotchas that are worth pointing out
for those who don't know yet.
>(or in the calltips, or in). Anyway, I
don't think there's any harm in overriding a builtin name in such a
small scope
In this specific case, possibly - because there are few chances you need
to get at the builtin object type here. Still, it's better to avoid
shadowing builtin names IMHO - if only for readability. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: JimmyT |
last post by:
I just configured and installed 2.3.4 and noticed there is no datetime
module. I noticed there is a datetimemodule.c file that did not get
built (ie no object file). Is there something I need to...
|
by: Alex Elbert |
last post by:
Hi
I have built dynamic HTMLTable. Now I want to attach it directly to the Email Body - it is already built, so why not to use a ready table. However, I cannot find the way of getting plain HTML...
|
by: Andrew Crook |
last post by:
does MYSQL have a quota built into it! I need it limit the size of each
database
AndiC
|
by: Mark |
last post by:
Is there a way to execute a statement that is built
dynamically by a .NET application.
For example I have a loop that is reading values from a
database and I want to do something like the...
|
by: Yasutaka Ito |
last post by:
Hi,
Is there a way to determine which version of .NET Framework any given
assembly is built with?
thanks!
-Yasutaka
|
by: William |
last post by:
Looking for a pre built dotnet corporate or small business website template.
|
by: William |
last post by:
Looking for a pre built dot net website for consulting business.
I am trying to put up a quick business web for a dot net frame work. I have
a provider already. I am trying to save time.
Any...
|
by: Daniel |
last post by:
is there any way to get to a unique build verion of an assembly at runtime?
e.g. a version that is unique to the time that the assembly was built?
|
by: meyer |
last post by:
Hi everyone,
which compiler will Python 2.5 on Windows (Intel) be built with? I
notice that Python 2.4 apparently has been built with the VS2003
toolkit compiler, and I read a post from Scott...
|
by: drewj840 |
last post by:
I built a Windows service that sweeps a set of folders every 60 seconds and puts the files into a SQL Server database. I am creating a second service that will delete this set of folders and recreate...
|
by: DolphinDB |
last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation.
Take...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: Aftab Ahmad |
last post by:
Hello Experts!
I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
|
by: Aftab Ahmad |
last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below.
Dim IE As Object
Set IE =...
|
by: marcoviolo |
last post by:
Dear all,
I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: ArrayDB |
last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
| |