namedtuples anamoly
Gary Herron
gherron at digipen.edu
Thu Oct 18 03:17:52 EDT 2018
On 10/17/2018 11:13 PM, me.vinob at gmail.com wrote:
> Hi,
>
> I tried using namedtuples and just found a behaviour which I am not able to
> conclude as correct behaviour.
>
> from collections import namedtuple
>
> (n, categories) = (int(input()), input().split())
> Grade = namedtuple('Grade', categories)
> Grade.ID = 1
> #print(Grade.ID)
> ob = Grade(10, 50)
> print(ob.ID)
> print(ob.MARKS)
> ob1 = Grade(20, 100)
> print(ob1.ID)
>
> 2
> ID MARKS
> 1
> 50
> 1
> 100
>
>
> If we set GRADE.ID =1 ,
Whoa! Don't do that. The Grade object created with the namedtuple call
is a class, and part of it's internal implementation is stored in
Grade.ID. Try these lines:
>>> print(Grade)
<class '__main__.Grade'>
>>> print(Grade.ID)
<property object at 0x7f1867e877c8>
>>>
By reassigning Grade.ID, you are sabotaging the internals of the class.
Without looking at those internals, it's not really a surprise that
things stop working after you destroy the <property object ...> it so
carefully stored in Grade.ID.
So now the real question is: What were you trying to accomplish with
the assignment? Tell us, and let's see if we can find a way to
accomplish yor goal without wrecking the internals of the Grade class.
Gary Herron
> it has impact on all variables. Is this behaviour
> just like class variable and it has global scope.
> I expected ob.ID and ob1.ID to be 10.
>
> Correct me if Iam wrong.
> Appreciate any quick response.
>
> Kind Rgds,
> Vinu
--
Dr. Gary Herron
Professor of Computer Science
DigiPen Institute of Technology
(425) 895-4418
More information about the Python-list
mailing list