I have a class called Argument, and a subclass called RangeArgument. 
Arguments have data in the form of a PickleType column. When I create two 
arguments by doing Argument(...data={"bla":"bla"}) and 
Argument(..data="bla2":"bla") it works fine, in that argument1.data is 
bla:bla and argument2.data is bla2:bla. But when I do the same for 
RangeArguments, it appears that each time I create a new one, all of the 
previous ones show the new one's data, instead of their own. 

Following is the shortened definition for Argument and RangeArgument


   1. #RangeArgument definition
   2.  
   3. class RangeArgument(Argument):
   4.         __mapper_args__ = {'polymorphic_identity': 'RangeArgument'}
   5.  
   6.         def __init__(self,arg,range):
   7.                 Argument.__init__(self,type="RangeArgument",
   description="An argument with a defined numeric range.")
   8.                 self.arg = arg
   9.                 self.range = range
   10.  
   11.         def validate(self):
   12.                 return self.arg in self.range
   13.  
   14.         @hybrid_property
   15.         def arg(self):
   16.                 return self.data['arg']
   17.  
   18.         @arg.setter
   19.         def arg(self,arg):
   20.                 self.data['arg'] = arg
   21.  
   22.         @hybrid_property
   23.         def range(self):
   24.             return self.data['range']
   25.  
   26.         @range.setter
   27.         def range(self,range):
   28.             self.data['range'] = range
   29.  
   30. #Argument definition
   31. class Argument(Base):
   32.         __tablename__ = "arguments"
   33.         id =                    Column(Integer, primary_key=True)
   34.         name =                  Column(String, default="untitled")
   35.         type =                  Column(String, default="Base")
   36.         description =   Column(String)
   37.         data =                  Column(PickleType, default={})
   38.         parent_id =     Column(Integer, ForeignKey(id))
   39.  
   40.         __mapper_args__ = {"polymorphic_on":type,
   41.                                            "polymorphic_identity":
   "Base"}
   42.         children =              relationship("Argument", backref=
   backref("parent", remote_side=[id]))
   

Following are passing and failing tests as example of what is happening:


   1. #Failing test
   2.     def test_argument_subclass_creation(self):
   3.         rang = [range(1,5),range(1,10),range(10,100)]
   4.  
   5.         rangearg_1 = RangeArgument(-1,rang[0])
   6.         rangearg_2 = RangeArgument(4,rang[1])
   7.         rangearg_3 = RangeArgument(74.5,rang[2])
   8.  
   9.         assert rangearg_1.data['range'] == rang[0]
   10.         assert rangearg_2.data['range'] == rang[1]
   11.         assert rangearg_3.data['range'] == rang[2]
   12.  
   13. #Passing test
   14. def test_arguments_insertion(self):
   15.         child1_data = {"child":"Hi!"}
   16.         child_1 = Argument(description="A child argument used for 
   testing", data=child1_data)
   17.         child2_data = {"child":"Hi!", "test":"it works"}
   18.         child_2 = Argument(description="A child argument used for 
   testing", data=child2_data)
   19.  
   20.         self.arguments["child_1"] = child_1
   21.         self.arguments["child_2"] = child_2
   22.  
   23.         assert not "test" in self.arguments["child_1"].data
   24.         assert "test" in self.arguments["child_2"].data
   25.         assert self.arguments["child_1"].data == child1_data
   26.         assert self.arguments["child_2"].data == child2_data
   

Am I doing something wrong here? I realize that at no point am I 
actually committing these to a database, could that possibly be the issue, 
somehow or another?

Thanks a lot!

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to