Python 3.2.3. There were some ideas listed here, which work on regular var's, but it seems **kwargs play by different rules... so why doesn't this work and how can I check to see if a key in **kwargs exists?
if kwargs['errormessage']:
print("It exists")
I also think this should work, but it doesn't --
if errormessage in kwargs:
print("yeah it's here")
I'm guessing because kwargs is iterable? Do I have to iterate through it just to check if a particular key is there?
This question is related to
python
dictionary
python-3.x
keyword-argument
DSM's and Tadeck's answers answer your question directly.
In my scripts I often use the convenient dict.pop()
to deal with optional, and additional arguments. Here's an example of a simple print()
wrapper:
def my_print(*args, **kwargs):
prefix = kwargs.pop('prefix', '')
print(prefix, *args, **kwargs)
Then:
>>> my_print('eggs')
eggs
>>> my_print('eggs', prefix='spam')
spam eggs
As you can see, if prefix
is not contained in kwargs
, then the default ''
(empty string) is being stored in the local prefix
variable. If it is given, then its value is being used.
This is generally a compact and readable recipe for writing wrappers for any kind of function: Always just pass-through arguments you don't understand, and don't even know if they exist. If you always pass through *args
and **kwargs
you make your code slower, and requires a bit more typing, but if interfaces of the called function (in this case print
) changes, you don't need to change your code. This approach reduces development time while supporting all interface changes.
You can discover those things easily by yourself:
def hello(*args, **kwargs):
print kwargs
print type(kwargs)
print dir(kwargs)
hello(what="world")
One way is to add it by yourself! How? By merging kwargs
with a bunch of defaults. This won't be appropriate on all occasions, for example, if the keys are not known to you in advance. However, if they are, here is a simple example:
import sys
def myfunc(**kwargs):
args = {'country':'England','town':'London',
'currency':'Pound', 'language':'English'}
diff = set(kwargs.keys()) - set(args.keys())
if diff:
print("Invalid args:",tuple(diff),file=sys.stderr)
return
args.update(kwargs)
print(args)
The defaults are set in the dictionary args
, which includes all the keys we are expecting. We first check to see if there are any unexpected keys in kwargs. Then we update args
with kwargs
which will overwrite any new values that the user has set. We don't need to test if a key exists, we now use args
as our argument dictionary and have no further need of kwargs
.
if kwarg.__len__() != 0:
print(kwarg)
It is just this:
if 'errormessage' in kwargs:
print("yeah it's here")
You need to check, if the key is in the dictionary. The syntax for that is some_key in some_dict
(where some_key
is something hashable, not necessarily a string).
The ideas you have linked (these ideas) contained examples for checking if specific key existed in dictionaries returned by locals()
and globals()
. Your example is similar, because you are checking existence of specific key in kwargs
dictionary (the dictionary containing keyword arguments).
Source: Stackoverflow.com