converting a string to a function parameter

K

koranthala

Hi,
Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?
 
C

Chris Rebert

Hi,
   Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?

Firstly, don't use `str` as a variable name since it conflicts with
the name of the builtin type.

Now here's how to use eval() properly:

[insert standard 'eval() is EVIL!' warning/lecture here]

eval("test("+the_str+")")

or

eval(test.__name__+"("+the_str+")")

Cheers,
Chris
 
K

koranthala

Hi,
   Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])
I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.
Is there any mechanism with which we can do this straight away?

Firstly, don't use `str` as a variable name since it conflicts with
the name of the builtin type.

Now here's how to use eval() properly:

[insert standard 'eval() is EVIL!' warning/lecture here]

eval("test("+the_str+")")

or

eval(test.__name__+"("+the_str+")")

Cheers,
Chris

Thank you very much Chris.
I also thought about the first method a second after I posted this.
But I never thought about the second method.
I will heed the warning about the str part.

Thank you very much again, Chris.
 
O

odeits

Hi,
    Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?

If the string has all of the names you could parse it into a
dictionary and pass it as the keyword arguments
 
A

Aaron Brady

Hi,
    Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?

I heard 'pyparsing' was good. ...Not that I've even been to its
webpage.
 
P

Paul McGuire

Hi,
    Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])
I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.
Is there any mechanism with which we can do this straight away?

I heard 'pyparsing' was good.  ...Not that I've even been to its
webpage.

Did someone say 'pyparsing'? :) Here is a first cut (partially lifted
from a previous post):


from pyparsing import *

LPAR,RPAR,LBRACK,RBRACK,EQ,COMMA = map(Suppress,"()[]=,")

noneLiteral = Literal("None")
boolLiteral = oneOf("True False")
integer = Combine(Optional(oneOf("+ -")) + Word(nums)).setName
("integer")
real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." +
Optional(Word(nums))).setName("real")

ident = Word(alphas+"_",alphanums+"_")

listStr = Forward().setName("list")
tupleStr = Forward().setName("tuple")
listItem = real | integer | noneLiteral | boolLiteral | \
quotedString.setParseAction(removeQuotes) | Group(listStr) |
tupleStr | ident
listStr << ( LBRACK + Optional(delimitedList(listItem)) + Optional
(COMMA) + RBRACK )
tupleStr << (LPAR + Optional(delimitedList(listItem)) + Optional
(COMMA) + RPAR)

# parse actions perform parse-time conversions
noneLiteral.setParseAction(lambda: None)
boolLiteral.setParseAction(lambda toks: toks[0]=="True")
integer .setParseAction(lambda toks: int(toks[0]))
real .setParseAction(lambda toks: float(toks[0]))
listStr .setParseAction(lambda toks: toks.asList())
tupleStr .setParseAction(lambda toks: tuple(toks.asList()))

arg = Group(ident("varname") + EQ + listItem("varvalue")) | listItem


argstring = 'True, type=rect, sizes=[3, 4,], coords = ([1,2],[3,4])'

parsedArgs = delimitedList(arg).parseString(argstring)
args = []
kwargs = {}
for a in parsedArgs:
if isinstance(a,ParseResults):
if isinstance(a.varvalue,ParseResults):
val = a.varvalue.asList()
else:
val = a.varvalue
kwargs[a.varname] = val
else:
args.append(a)

print "Args:", args
print "Kwargs:", kwargs


Prints:

Args: [True]
Kwargs: {'coords': ([1, 2], [3, 4]), 'type': 'rect', 'sizes': [3, 4]}
 
A

Aaron Brady

Hi,
    Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])
I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.
Is there any mechanism with which we can do this straight away?
I heard 'pyparsing' was good.  ...Not that I've even been to its
webpage.

Did someone say 'pyparsing'? :)  Here is a first cut (partially lifted
from a previous post): snip 40 lines
Prints:

Args: [True]
Kwargs: {'coords': ([1, 2], [3, 4]), 'type': 'rect', 'sizes': [3, 4]}

Ha, ok, out of my league. It's a bit heavyweight I accede. The OP
didn't say what s/he knew about his/er data prior, what fault
tolerance s/he needed, what complexity and nesting of data in the
string, etc.

Hmmm..., just thinking. Could the strings come from a python file:
test1= fargs(True, type=rect, sizes=[3, 4])
test2= fargs(...)
?
 
P

pietrodcof

Il giorno venerdì 13 marzo 2009 08:52:39 UTC+1, koranthala ha scritto:
Hi,
Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?

I need the exact opposite, what is the inverse function?
example: i pass to a function an argument

m=[654,54,65]
def function(m):
return takethenameof(m)

and it have to return to me 'm' not [654,54,65] or '[654,54,65]'

anybody can help?
i think that when one is talking about a function he have to talk also of the inverse function (also because google have problems searching about this....)
 
N

Ned Batchelder

Il giorno venerdì 13 marzo 2009 08:52:39 UTC+1, koranthala ha scritto:
Hi,
Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?

I need the exact opposite, what is the inverse function?
example: i pass to a function an argument

m=[654,54,65]
def function(m):
return takethenameof(m)

and it have to return to me 'm' not [654,54,65] or '[654,54,65]'

anybody can help?
i think that when one is talking about a function he have to talk also of the inverse function (also because google have problems searching about this...)

The difficulty in writing such a function is that values don't have
unique names, if they have names at all. What should be returned in
these cases?

m = [654, 54, 65]
def function(m):
m2 = m
m3 = m[:]
takethenameof(m)
takethenameof(m2)
takethenameof(m3)
takethenameof(m[:])
takethenameof(2)
takethenameof(2+2)

There are samples online that try to do a "reasonable" job of this, but
my googling isn't turning them up...
 
G

Gary Herron

Il giorno venerdì 13 marzo 2009 08:52:39 UTC+1, koranthala ha scritto:
Hi,
Is it possible to convert a string to a function parameter?
Ex:
str = 'True, type=rect, sizes=[3, 4]'
and I should be able to use it as:
test(convert(str)) and the behaviour should be same as calling test
with those values :
i.e. test(True, type=rect, sizes=[3, 4])

I tried eval, but it did not work. And any other mechanism I think
turns out to be creating a full fledged python parser.

Is there any mechanism with which we can do this straight away?
I need the exact opposite, what is the inverse function?
example: i pass to a function an argument

m=[654,54,65]
def function(m):
return takethenameof(m)

and it have to return to me 'm' not [654,54,65] or '[654,54,65]'

anybody can help?
i think that when one is talking about a function he have to talk also of the inverse function (also because google have problems searching about this...

Absolutely not. Objects (like [654,54,65]) do not have names, never did
and never will! Objects do have a type and a value (and an identity),
but not a name.

Various namespaces will have dictionary-like associations between a name
(like "m") and an object, and it *is* possible to get your hands on a
(dictionary representing a) namespace and search it, but this is
troublesome.

For instance, consider this small variation of your code:

def function(m):
return takethenameof(m)

a=[654,54,65]
b = a
function(a)

While function is running, there will be three names associated with the list object.
The outer namespace will have "a" and "b" associated with the list object,
and the namespace local to function will have "m" associated with the same object.
That's one object associated with three names in two different namespaces.

Gary Herron
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,276
Latest member
Sawatmakal

Latest Threads

Top