Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: 'Dubbele' variabelen in python  (gelezen 3275 keer)

'Dubbele' variabelen in python
« Gepost op: 2012/01/05, 16:00:11 »
Is er een manier om met bijvoorbeeld ding_1, ding_2, ding_3 etc. makkelijker te maken, zodat je het volgende idee krijgt:
for n in aantal_dingen:
    ding_n
Waar n het laatste nummer wordt?
Desktop:
Processor: Intel® Core™2 Quad CPU Q8300 @ 2.50GHz × 4, Geheugen: 3.9Gb, GPU: nVidia 220GT OS: Windows 7 64 bit / Ubuntu 12.04 64 bit
Notebook:
Processor: Intel® Core™ i7-4700MQ, Geheugen: 8Gb, GPU: nVidia GTX765m (met Optimus) OS: Windows 8 64 bit / Elementary OS Luna 64 bit

Re: 'Dubbele' variabelen in python
« Reactie #1 Gepost op: 2012/01/05, 16:15:08 »
Voor lokale variabelen kunt ge vars() gebruiken, voor class variabelen gebruik ik liever setattr().

>>> for x in range(10):
...   vars()["ding_%d" %x] = x
...
>>> vars()
{'ding_9': 9, 'ding_8': 8, '__builtins__': <module '__builtin__' (built-in)>, 'ding_6': 6, 'ding_5': 5, 'ding_4': 4, 'ding_3': 3, 'ding_2': 2, 'ding_1': 1, 'ding_0': 0, 'ding_7': 7, 'x': 9, '__name__': '__main__', '__package__': None, '__doc__': None}
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'ding_0', 'ding_1', 'ding_2', 'ding_3', 'ding_4', 'ding_5', 'ding_6', 'ding_7', 'ding_8', 'ding_9', 'x']
>>> class A(object):
...   def __init__(self):
...     for x in range(10):
...       setattr(self, "ding_%d" %x, x)
...
>>> a = A()
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ding_0', 'ding_1', 'ding_2', 'ding_3', 'ding_4', 'ding_5', 'ding_6', 'ding_7', 'ding_8', 'ding_9']
>>>

Re: 'Dubbele' variabelen in python
« Reactie #2 Gepost op: 2012/01/05, 16:41:03 »
Aah danke zeer :D
Ga er mee aan de slag, kijken of het me nu lukt.
Desktop:
Processor: Intel® Core™2 Quad CPU Q8300 @ 2.50GHz × 4, Geheugen: 3.9Gb, GPU: nVidia 220GT OS: Windows 7 64 bit / Ubuntu 12.04 64 bit
Notebook:
Processor: Intel® Core™ i7-4700MQ, Geheugen: 8Gb, GPU: nVidia GTX765m (met Optimus) OS: Windows 8 64 bit / Elementary OS Luna 64 bit

Re: 'Dubbele' variabelen in python
« Reactie #3 Gepost op: 2012/01/05, 16:51:11 »
Nog een vraagje, waarom gebruik je liever setattr voor classes i.p.v. vars?
Desktop:
Processor: Intel® Core™2 Quad CPU Q8300 @ 2.50GHz × 4, Geheugen: 3.9Gb, GPU: nVidia 220GT OS: Windows 7 64 bit / Ubuntu 12.04 64 bit
Notebook:
Processor: Intel® Core™ i7-4700MQ, Geheugen: 8Gb, GPU: nVidia GTX765m (met Optimus) OS: Windows 8 64 bit / Elementary OS Luna 64 bit

Re: 'Dubbele' variabelen in python
« Reactie #4 Gepost op: 2012/01/05, 17:00:59 »
Eigenlijk rommel ik liever niet met vars(), __dict__ enzoverder. setattr() komt overeen met het gewoon declareren van een class variabele:
setattr(obj, "spam", "eggs")
komt overeen met:
obj.spam = "eggs"

Als het nodig is, hebt ge ook nog het tegenovergestelde getattr().

Re: 'Dubbele' variabelen in python
« Reactie #5 Gepost op: 2012/01/05, 17:04:27 »
Is het niet makkelijker om gewoon met een array, lijst of woordenboek te werken voor de informatie die je op wil slaan?

Re: 'Dubbele' variabelen in python
« Reactie #6 Gepost op: 2012/01/05, 17:06:45 »
Ja die getattr() die zal ik ook nog wel moeten gaan gebruiken.
Nu heb snap ik eigenlijk nog niet waar het object in setattr(object, name, value) voor is.

Is het niet makkelijker om gewoon met een array, lijst of woordenboek te werken voor de informatie die je op wil slaan?
Alle ding_x moeten apart gepakt worden door zelfgemaakte_def(object), waar object ding_1, ding_2 etc. moet worden.
Desktop:
Processor: Intel® Core™2 Quad CPU Q8300 @ 2.50GHz × 4, Geheugen: 3.9Gb, GPU: nVidia 220GT OS: Windows 7 64 bit / Ubuntu 12.04 64 bit
Notebook:
Processor: Intel® Core™ i7-4700MQ, Geheugen: 8Gb, GPU: nVidia GTX765m (met Optimus) OS: Windows 8 64 bit / Elementary OS Luna 64 bit

Re: 'Dubbele' variabelen in python
« Reactie #7 Gepost op: 2012/01/05, 18:05:56 »
Nu heb snap ik eigenlijk nog niet waar het object in setattr(object, name, value) voor is.

Eender welk object, en bijna alles in Python is een object. Zie deze getattr test:
>>> l = list()
>>> getattr(l, 'append')
<built-in method append of list object at 0x7f6810530ef0>
>>> d = dict()
>>> getattr(d, 'keys')
<built-in method keys of dict object at 0xd1cb60>
>>> s = 'spam'
>>> getattr(s, 'lower')
<built-in method lower of str object at 0x7f6810538e10>
>>>

Hetzelfde geld voor setattr. Het eerste argument is een object, een zelfgedefinieerde klasse meestal.
>>> class A(object): pass
...
>>> a = A()
>>> setattr(a, 'spam', 'eggs')
>>> a.spam
'eggs'
>>>

Dit is slechts een voorbeeld natuurlijk. In dit geval is het veel simpeler om de variabele spam rechtstreeks in de class te definieren.

Re: 'Dubbele' variabelen in python
« Reactie #8 Gepost op: 2012/03/13, 21:58:22 »
Het lukt me nu opeens niet meer, ik krijg AttributeError: 'str' has no attribute 'x'.
Code:
p = '5'
for i in range(2):
    setattr("ding%d" %(i+1), 'iets', p)
Terwijl het volgende in feite hetzelfde is (?) maar wel werkt:
ding1.iets = p
Wat doe ik fout?
Desktop:
Processor: Intel® Core™2 Quad CPU Q8300 @ 2.50GHz × 4, Geheugen: 3.9Gb, GPU: nVidia 220GT OS: Windows 7 64 bit / Ubuntu 12.04 64 bit
Notebook:
Processor: Intel® Core™ i7-4700MQ, Geheugen: 8Gb, GPU: nVidia GTX765m (met Optimus) OS: Windows 8 64 bit / Elementary OS Luna 64 bit

Re: 'Dubbele' variabelen in python
« Reactie #9 Gepost op: 2012/03/13, 22:24:34 »
Wat je ook aan het doen bent, als er reflection voor nodig is, you're doing it wrong.
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Re: 'Dubbele' variabelen in python
« Reactie #10 Gepost op: 2012/03/13, 22:49:36 »
Het lukt me nu opeens niet meer, ik krijg AttributeError: 'str' has no attribute 'x'.
Code:
p = '5'
for i in range(2):
    setattr("ding%d" %(i+1), 'iets', p)
Terwijl het volgende in feite hetzelfde is (?) maar wel werkt:
ding1.iets = p
Wat doe ik fout?

Uw code komt overeen met:
"ding1".iets = 5
De eerste parameter voor setattr() moet een class zijn die de __setattr__ method heeft. Builtin objects zoals strings, ints, lists etc hebben die dus niet.

Ge zult dus uw code moeten veranderen dat ge eerst het juiste object opvraagt (ding1, ding2).

Re: 'Dubbele' variabelen in python
« Reactie #11 Gepost op: 2012/03/14, 14:57:27 »
Ah oke, dan lukt het nu wel, bedankt ;)
Desktop:
Processor: Intel® Core™2 Quad CPU Q8300 @ 2.50GHz × 4, Geheugen: 3.9Gb, GPU: nVidia 220GT OS: Windows 7 64 bit / Ubuntu 12.04 64 bit
Notebook:
Processor: Intel® Core™ i7-4700MQ, Geheugen: 8Gb, GPU: nVidia GTX765m (met Optimus) OS: Windows 8 64 bit / Elementary OS Luna 64 bit