Newbie: How can I use a string value for a keyword argument?

2008-02-25 Thread Doug Morse
Hi,

My apologies for troubling for what is probably an easy question... it's just
that can't seem to find an answer to this anywhere (Googling, pydocs, etc.)...

I have a class method, MyClass.foo(), that takes keyword arguments.  For
example, I can say:

x = MyClass()
x.foo(trials=32)

Works just fine.

What I need to be able to do is call foo() with a string value specifying the
keyword (or both the keyword and value would be fine), something along the
lines of:

x = MyClass()
y = 'trials=32'
x.foo(y)# doesn't work

or

x.MyClass()
y = 'trials'
x.foo(y = 32)   # does the wrong thing

Surely there's some way to use a string's value as the key for making a method
call with a keyword argument?

Just for completeness, my goal is simply to read a bunch of key/value pairs
from an INI file (using ConfigObj) and then use those key/value pairs to set a
(3rd party) object's parameters, which must be done with a call along the
lines of instance.set(key=value).  Obviously, I could create a huge if..elif
statement along the lines of if y = 'trials': x.foo(trials=32); elif y =
'speed': x.foo(speed=12); etc., but then the statement has to be maintained
every time a new parameter is added/changed etc.  Plus, such a solution seems
to me grossly inelegant and un-Pythonic.

Thanks in advance for any and all assistance!

Doug





-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: How can I use a string value for a keyword argument?

2008-02-25 Thread John Machin
On Feb 25, 10:42 pm, Doug Morse [EMAIL PROTECTED] wrote:
 Hi,

 My apologies for troubling for what is probably an easy question... it's just
 that can't seem to find an answer to this anywhere (Googling, pydocs, etc.)...

 I have a class method, MyClass.foo(), that takes keyword arguments.  For
 example, I can say:

 x = MyClass()
 x.foo(trials=32)

 Works just fine.

 What I need to be able to do is call foo() with a string value specifying the
 keyword (or both the keyword and value would be fine), something along the
 lines of:

 x = MyClass()
 y = 'trials=32'
 x.foo(y)# doesn't work

 or

 x.MyClass()
 y = 'trials'
 x.foo(y = 32)   # does the wrong thing

 Surely there's some way to use a string's value as the key for making a method
 call with a keyword argument?

 Just for completeness, my goal is simply to read a bunch of key/value pairs
 from an INI file (using ConfigObj) and then use those key/value pairs to set a
 (3rd party) object's parameters, which must be done with a call along the
 lines of instance.set(key=value).  Obviously, I could create a huge if..elif
 statement along the lines of if y = 'trials': x.foo(trials=32); elif y =
 'speed': x.foo(speed=12); etc., but then the statement has to be maintained
 every time a new parameter is added/changed etc.  Plus, such a solution seems
 to me grossly inelegant and un-Pythonic.


I'm not quite sure what foo() is really supposed to do ... however the
built-in function setattr is your friend. Assuming that ini_dict
contains what you have scraped out of your .ini file, you can do:
x = MyCLass()
for key, value in ini_dict.items():
setattr(x, key, value)
You may prefer (I would) to do it inside the class, and maybe do some
checking/validation:
class MyClass(object):
def load(self, adict):
for k, v in adict.items():
# do checking here
setattr(self, k, v)
   # much later
   x = MyClass()
   x.load(ini_dict)

HTH,
John
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: How can I use a string value for a keyword argument?

2008-02-25 Thread bockman
On 25 Feb, 12:42, Doug Morse [EMAIL PROTECTED] wrote:
 Hi,

 My apologies for troubling for what is probably an easy question... it's just
 that can't seem to find an answer to this anywhere (Googling, pydocs, etc.)...

 I have a class method, MyClass.foo(), that takes keyword arguments.  For
 example, I can say:

 x = MyClass()
 x.foo(trials=32)

 Works just fine.

 What I need to be able to do is call foo() with a string value specifying the
 keyword (or both the keyword and value would be fine), something along the
 lines of:

 x = MyClass()
 y = 'trials=32'
 x.foo(y)        # doesn't work

 or

 x.MyClass()
 y = 'trials'
 x.foo(y = 32)   # does the wrong thing


Try this:
y='trials'
x.foo( **{y:32} )

Ciao
-
FB


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: How can I use a string value for a keyword argument?

2008-02-25 Thread Bruno Desthuilliers
Doug Morse a écrit :
 Hi,
 
 My apologies for troubling for what is probably an easy question... it's just
 that can't seem to find an answer to this anywhere (Googling, pydocs, etc.)...
 
 I have a class method, MyClass.foo(), that takes keyword arguments.  For
 example, I can say:
 
 x = MyClass()
 x.foo(trials=32)
 
 Works just fine.
 
 What I need to be able to do is call foo() with a string value specifying the
 keyword (or both the keyword and value would be fine), something along the
 lines of:
 
 x = MyClass()
 y = 'trials=32'
 x.foo(y)# doesn't work

You want something like:

x.foo(**{'trials':32})


 Just for completeness, my goal is simply to read a bunch of key/value pairs
 from an INI file (using ConfigObj) 

ConfigObj being a subclass of dict, you should be able to use it 
directly, ie:

x.foo(**my_config)

If just want to pass a section of the ConfigObj, it should work just the 
same.

HTH
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: How can I use a string value for a keyword argument?

2008-02-25 Thread Doug Morse
On Mon, 25 Feb 2008 04:20:37 -0800 (PST), John Machin [EMAIL PROTECTED]
wrote:
  On Feb 25, 10:42 pm, Doug Morse [EMAIL PROTECTED] wrote:
  Hi,
 
  My apologies for troubling for what is probably an easy question... it's 
  just
  that can't seem to find an answer to this anywhere (Googling, pydocs, 
  etc.)...
 
  I have a class method, MyClass.foo(), that takes keyword arguments.  For
  example, I can say:
 
  x = MyClass()
  x.foo(trials=32)
 
  Works just fine.
 
  What I need to be able to do is call foo() with a string value specifying 
  the
  keyword (or both the keyword and value would be fine), something along the
  lines of:
 
  x = MyClass()
  y = 'trials=32'
  x.foo(y)# doesn't work
 
  or
 
  x.MyClass()
  y = 'trials'
  x.foo(y = 32)   # does the wrong thing
 
  Surely there's some way to use a string's value as the key for making a 
  method
  call with a keyword argument?
 
  Just for completeness, my goal is simply to read a bunch of key/value pairs
  from an INI file (using ConfigObj) and then use those key/value pairs to 
  set a
  (3rd party) object's parameters, which must be done with a call along the
  lines of instance.set(key=value).  Obviously, I could create a huge 
  if..elif
  statement along the lines of if y = 'trials': x.foo(trials=32); elif y =
  'speed': x.foo(speed=12); etc., but then the statement has to be maintained
  every time a new parameter is added/changed etc.  Plus, such a solution 
  seems
  to me grossly inelegant and un-Pythonic.
 
 
  I'm not quite sure what foo() is really supposed to do ... however the
  built-in function setattr is your friend. Assuming that ini_dict
  contains what you have scraped out of your .ini file, you can do:
  x = MyCLass()
  for key, value in ini_dict.items():
  setattr(x, key, value)
  You may prefer (I would) to do it inside the class, and maybe do some
  checking/validation:
  class MyClass(object):
  def load(self, adict):
  for k, v in adict.items():
  # do checking here
  setattr(self, k, v)
 # much later
 x = MyClass()
 x.load(ini_dict)
 
  HTH,
  John

Hi John,

Your response is most helpful and informative -- thanks!  

I don't think that setattr() is exactly what I need, though, as foo() doesn't
actually create or update its instance attributes.  What I need to be able to
do is call foo() specifying keyword arguments not directly but viz a viz
another variable or variables that contain the keywords and values.

I'm pretty sure I just found the solution, which is to use the **-operator on
a dictionary.  Actually, ConfigObj (the INI file reader) subclasses from
__builtin__.dict (i.e., the class/object *is* a dictionary), so the following
seems to work perfectly:

x.foo(**config)

This sends ALL the key/value pairs in config as keyword/value pairs to foo(),
which is exactly what I need.

Just FYI, I located this solution via Google shortly after posting, so I have
sent a cancel request on my original post.

Thanks again!
Doug
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie: How can I use a string value for a keyword argument?

2008-02-25 Thread Gary Herron
Doug Morse wrote:
 Hi,

 My apologies for troubling for what is probably an easy question... it's just
 that can't seem to find an answer to this anywhere (Googling, pydocs, etc.)...

 I have a class method, MyClass.foo(), that takes keyword arguments.  For
 example, I can say:

 x = MyClass()
 x.foo(trials=32)

 Works just fine.

 What I need to be able to do is call foo() with a string value specifying the
 keyword (or both the keyword and value would be fine), something along the
 lines of:

 x = MyClass()
 y = 'trials=32'
 x.foo(y)# doesn't work
   
Keyword args are represented during the calling process as a 
dictionary,   You can create the dictionary yourself, and slip it into 
the calling arguments with a ** notation:

kw = {somestring:32}
x.foo(**kw)

Gary Herron

 or

 x.MyClass()
 y = 'trials'
 x.foo(y = 32)   # does the wrong thing

 Surely there's some way to use a string's value as the key for making a method
 call with a keyword argument?

 Just for completeness, my goal is simply to read a bunch of key/value pairs
 from an INI file (using ConfigObj) and then use those key/value pairs to set a
 (3rd party) object's parameters, which must be done with a call along the
 lines of instance.set(key=value).  Obviously, I could create a huge if..elif
 statement along the lines of if y = 'trials': x.foo(trials=32); elif y =
 'speed': x.foo(speed=12); etc., but then the statement has to be maintained
 every time a new parameter is added/changed etc.  Plus, such a solution seems
 to me grossly inelegant and un-Pythonic.

 Thanks in advance for any and all assistance!

 Doug





   

-- 
http://mail.python.org/mailman/listinfo/python-list