I am unpacking a list into variables, for some reason they need to be
unpacked into variable names like a0,a1,a2....upto aN whatever is
in the list.
How to create the variables dynamically ?
I am looking for something like
pseudo code line follows :
a%s = str(value)
here below is a snippet from the mylist unpack code
#next lines cut the end of line character from each line in the list
mylist = [line[:-1] for line in mylist]
for index,value in enumerate(mylist):
if index == 0 :
a0 = str(value)
print "a0 : ",a0
elif index == 1 :
a1 = str(value)
print "a1 : ",a1
Thanks
Nx
Explain this "some reason". This smells, and the way to go would be to
use a dict mapping a_n to whatever is in the list - not creating
variables. How do you want to access generated variables anyway -
especially when you don't have the faintest idea how many of them there
are? Obviously there can't be code written based on that.
Regards,
Diez
You're probably doing things the wrong way. What is your ultimate goal
with this? There is probably a better way of doing it.
In the mean time, look at eval().
Sybren
--
The problem with the world is stupidity. Not saying there should be a
capital punishment for stupidity, but why don't we just take the
safety labels off of everything and let the problem solve itself?
Frank Zappa
Really? Why?
--
Robert Kern
rk...@ucsd.edu
"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter
> I am unpacking a list into variables, for some reason they need to be
> unpacked into variable names like a0,a1,a2....upto aN whatever is
> in the list.
why?
</F>
>>> suffix = 'var'
>>> vars()['a%s' % suffix] = 45
>>> avar
45
--
-------------------------------------------------------------------
Peter Maas, M+R Infosysteme, D-52070 Aachen, Tel +49-241-93878-0
E-mail 'cGV0ZXIubWFhc0BtcGx1c3IuZGU=\n'.decode('base64')
-------------------------------------------------------------------
Quoting from http://docs.python.org/lib/built-in-funcs.html#l2h-76 about
the "vars" built in:
The returned dictionary should not be modified: the effects on the
corresponding symbol table are undefined.
--
Benji York
here is an example for what it will be used for , in this case
fixed at 31 fieldvalues:
inputvalues=(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,
s26,s27,s28,s29,s30,s31)
MYINSERTSELECT = "INSERT INTO
ADDRESS(ALIAS,COMPANY,ADDRESSLI1,ADDRESSLI2,ADDRESSCO,TOWN,ZIP,COUNTRY,TEL1,TEL2,FAX,EMAIL,INTERNET,PERSON1,TITLE1,RES1,PERSON2,TITLE2,RES2,PERSON3,TITLE3,RES3,PERSON4,TITLE4,RES4,PERSON5,TITLE5,RES5,PRODALIAS,PAGER,TLX,ADDMEMO)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
con1.commit()
cur = con1.cursor()
try :
cur.execute(MYINSERTSELECT,inputvalues)
con1.commit()
print 'Inserted 1 record'
except IOError, (errno, strerror):
print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
I am sure there is an easier way, but I have not found it yet.
Nx
If I refer to your original post, there's someting I dont understand:
"""
I am unpacking a list into variables, for some reason they need to be
unpacked into variable names like a0,a1,a2....upto aN whatever is
in the list.
"""
Why unpack inputvalues if your next step is to pack'em back again ? Or
what did I miss ?
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'on...@xiludom.gro'.split('@')])"
inputvalues = tuple(mylist)
Hope this helps,
Carsten.
for count in range(0,maxcount):
value = values[count]
exec(eval("'a%s=%s' % (count, value)"))
But I am also wonder: why?
And actually, you probably don't have to do that, because the execute
method should be able to handle a list just as well as a tuple.
-Carsten.
Nx
Again, why unpack them into separate variables when they are *already*
in the form that you want to use them?
why using the eval?
exec ('a%s=%s' % (count, value))
should be fine
--
rafi
"Imagination is more important than knowledge."
(Albert Einstein)
If you really want to make something like this work you can define a
class that would work like this:
vars = funkyclass()
varname = 'x'
vars[varname] = value
vars.x
But this is clearly a design mistake. Either you know the names of the
variables when you write the code or you do not. If you know them you
can simply assign them directly. If you do not know them then you can't
put them in the code to read their values anyway, and what you need is
just a regular dictionary.
rg
> If you really want to make something like this work you can define a
> class that would work like this:
>
> vars = funkyclass()
> varname = 'x'
> vars[varname] = value
> vars.x
>
> But this is clearly a design mistake. Either you know the names of the
> variables when you write the code or you do not. If you know them you
> can simply assign them directly. If you do not know them then you can't
> put them in the code to read their values anyway, and what you need is
> just a regular dictionary.
In fact, I do this all of the time.
class Bunch(dict):
def __init__(self, *args, **kwds):
dict.__init__(self, *args, **kwds)
self.__dict__ = self
It's a lifesaver when you're working at the interactive prompt. In the
bowels of my modules, I may not know what the contents are at code-time,
but at the prompt I probably do. Bunch assists both usages.
regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
> In the
> bowels of my modules, I may not know what the contents are at code-time,
Then how do you write your code?
rg
And this demonstrates why exec as a statement was a mistake ;)
It actually is
exec 'a%s=%s' % (count, value)
Reinhold
>>> exec(eval("'a%s=%s' % (count, value)"))
>>
>>why using the eval?
>>
>>exec ('a%s=%s' % (count, value))
>>
>>should be fine
>
> And this demonstrates why exec as a statement was a mistake ;)
>
> It actually is
>
> exec 'a%s=%s' % (count, value)
Noted.
In the meantime another question I cannot find an answer to: any idea
why does eval() consider '=' as a syntax error?
>>> eval ('a=1')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<string>", line 1
a=1
^
SyntaxError: invalid syntax
Thanks
With style. ;-)
I use a Bunch where I might otherwise use a dictionary inside my modules
because it *is* a dictionary. Interactively, I'll usually use it as an
object with attributes. The keys are usually ideosyncratic, like station
codes for permanent GPS stations (e.g. "CAND", "USLO", "MNMC", "MIDA"),
rather than generic (e.g. "northing", "day").
So I might have a function that do some analysis on all of the GPS
stations within a Bunch. I don't know the names of the stations when I'm
writing the function, but I can iterate over the keys and values in the
Bunch.
def subtract_reference(data, refstation):
"""Subtract the motion of the reference station from the remaining
timeseries.
"""
refdata = data[refstation]
for station in data:
if station == refstation:
continue
data[station].northing -= refdata.northing
data[station].easting -= refdata.easting
# ...
At the prompt, though, I may want to plot CAND's timeseries.
In [10]: plot(data.CAND.t, data.CAND.northing)
Bunch allows me to use "data[station]" and "data.CAND" as the situation
demands rather than forcing me to use the clunkier "getattr(data,
station)" or "data['CAND']", respectively.
> In the meantime another question I cannot find an answer to: any idea
> why does eval() consider '=' as a syntax error?
>
> >>> eval ('a=1')
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "<string>", line 1
> a=1
> ^
> SyntaxError: invalid syntax
eval *evaluates* an expression. "a=1" is a statement. It has no value.
> Because eval() takes an expression as an argument, and assignment is a
> statement.
I am definitely not a language lawyer... but I should a little bit more
thanks,
> rafi wrote:
> > Reinhold Birkenfeld wrote:
> >
> >
> >>>> exec(eval("'a%s=%s' % (count, value)"))
> >>>
> >>>why using the eval?
> >>>
> >>>exec ('a%s=%s' % (count, value))
> >>>
> >>>should be fine
> >>
> >>And this demonstrates why exec as a statement was a mistake ;)
> >>
> >>It actually is
> >>
> >>exec 'a%s=%s' % (count, value)
> >
> >
> > Noted.
> >
> > In the meantime another question I cannot find an answer to: any idea
> > why does eval() consider '=' as a syntax error?
> >
> > >>> eval ('a=1')
> > Traceback (most recent call last):
> > File "<stdin>", line 1, in ?
> > File "<string>", line 1
> > a=1
> > ^
> > SyntaxError: invalid syntax
> >
> > Thanks
> >
> Because eval() takes an expression as an argument, and assignment is a
> statement.
And if you find this distinction annoying, try Lisp.
rg
Most of the time it is not that you want to do something
in a certain way , it rather is one cannot think of a
better , faster more efficient way .
Nx
>>> for count in range(0, 10):
... value = count
... exec("'a%s=%s' % (count, value)")
...
>>> dir()
['__builtins__', '__doc__', '__name__', 'count', 'value']
>>> for count in range(0, 10):
... value = count
... exec(eval("'a%s=%s' % (count, value)"))
...
>>> dir()
['__builtins__', '__doc__', '__name__', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'count', 'value']
>>>
I myself use code like this to load user defined classes.
exec(eval("'from %s import %s' % (script, script)"))
exec(eval("'self.user_class = %s()' % script"))
self.user_class.run()
But this can probably be done with the imp module too.
>>>rafi <ra...@free.fr> 08/25/05 6:03 pm >>>
Adriaan Renting wrote:
>You might be able to do something along the lines of
>
>for count in range(0,maxcount):
> value = values[count]
> exec(eval("'a%s=%s' % (count, value)"))
why using the eval?
exec ('a%s=%s' % (count, value))
should be fine
--
rafi
"Imagination is more important than knowledge."
(Albert Einstein)
>>Because eval() takes an expression as an argument, and assignment is a
>>statement.
>
> And if you find this distinction annoying, try Lisp.
that's were I come from :-)
You did not copy the suggestion properly:
>>> for count in range(0, 10):
... exec 'a%s = %s' % (count,count)
...
>>> dir()
['__builtins__', '__doc__', '__file__', '__name__', 'a0', 'a1', 'a2',
'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'count']
>>> a5
5
(you can put additional parentheses around the string, but not
additional quotation marks)
Regards,
Martin
>Not in my Python.
>
>---snip---
>
>why using the eval?
>
>exec ('a%s=%s' % (count, value))
>
>should be fine
>
>--
>rafi
--- I appologize for any top-posting, and improper inlining, I'm using groupwise ---
>>>"Martin v. Löwis" <mar...@v.loewis.de> 08/26/05 10:19 am >>>
--
http://mail.python.org/mailman/listinfo/python-list
I tried this once and it worked. This may be too naive, so thanks
for the warning :)
--
-------------------------------------------------------------------
Peter Maas, M+R Infosysteme, D-52070 Aachen, Tel +49-241-93878-0
E-mail 'cGV0ZXIubWFhc0BtcGx1c3IuZGU=\n'.decode('base64')
-------------------------------------------------------------------
But that's not what rafi suggested.
rafi:
> why using the eval?
>
> exec ('a%s=%s' % (count, value))
See the difference?
Yes. A large part of learning a language is discovering the many idioms
that have already been established for doing certain things. These are a
kind of shorthand, established by long convention, that allow one to
avoid the "learning-by-use" curve. When I first came to Python that was
a very rewarding aspect of this newsgroup.
To this day it remains one of the friendliest tech-spots in cyberspace.
"Adriaan Renting" <ren...@astron.nl> writes:
> Not in my Python.
>
>>>> for count in range(0, 10):
> ... value = count
> ... exec("'a%s=%s' % (count, value)")
You left in the extra set of quotes. Try this:
>>> for count in range(10):
... value = count
... exec 'a%s = %s' % (count, value)
...
>>> dir()
['__builtins__', '__doc__', '__file__', '__name__', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'count', 'help', 'readline', 'rlcompleter', 'sys', 'value']
I also removed the extraneous parens that you and Rafi both used -
exec is a statement, not a function.
Of course, your two examples are better done using imp and globals() or
locals().
<mike
--
Mike Meyer <m...@mired.org> http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
My original code was: exec(eval("'a%s=%s' % (count, value)"))
Then Rafi said: exec("'a%s=%s' % (count, value)")
To which I responded that his example does not work in my Python, and I think it's invalid.
Then Martin came with: exec 'a%s = %s' % (count, value)
This does work.
But he seems to keep telling me I'm quoting him wrong, while I'm quoting Rafi.
Furthermore I'm going with your suggestion of checking the imp, globals() and locals().
Adriaan Renting.
>>>Mike Meyer <m...@mired.org> 08/27/05 2:24 am >>>
> My original code was: exec(eval("'a%s=%s' % (count, value)"))
> Then Rafi said: exec("'a%s=%s' % (count, value)")
> To which I responded that his example does not work in my Python, and I think it's invalid.
> Then Martin came with: exec 'a%s = %s' % (count, value)
> This does work.
> But he seems to keep telling me I'm quoting him wrong, while I'm quoting Rafi.
Read more carefully. rafi did not put in the extraneous quotes.
rafi:
>>Adriaan Renting wrote:
>>
>>>You might be able to do something along the lines of
>>>
>>>for count in range(0,maxcount):
>>>value = values[count]
>>>exec(eval("'a%s=%s' % (count, value)"))
>>
>>why using the eval?
>>
>>exec ('a%s=%s' % (count, value))
>>
>>should be fine
>>
>>--
>>rafi
See? No extra quotes.
I'm sorry, it is indeed my mistake.
I was thinking people were telling me I was quoting Martin wrong, while I was quoting Rafi wrong. I'll promise not quote anybody anymore until I have an e-mail program that can quote/copy properly. As reading it in one window, then typing it in another to test it, then copying it back, obviously introduced a PEBKAC error.
Adriaan Renting
> Yes. A large part of learning a language is discovering the many idioms
> that have already been established for doing certain things. These are a
> kind of shorthand, established by long convention, that allow one to
> avoid the "learning-by-use" curve.
it's not obvious that the OP has found the pydiomatic way to solve
his problem, though, given that most of this thread have been spent
on playing with exec, and that Robert Kern's question from the be-
ginning of this thread has still not been answered:
"Again, why unpack them into separate variables when they are *already*
in the form that you want to use them?"
</F>
cheers,
--Tim
You can lead an idiot to idioms, but you can't make him think ;-)
"You can lead an idiot to idioms, but you can't make him think!" --
Steve Holden 2005