[ 
https://issues.apache.org/jira/browse/THRIFT-4623?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17608619#comment-17608619
 ] 

Grzegorz Lyczba commented on THRIFT-4623:
-----------------------------------------

We also have another issue with it. Default values have only one instance so 
changes for mutable types will be applied to all objects:
{code:java}
>>> from gen.test import ttypes
>>> b1 = ttypes.B()
>>> b1
B(itm=A(value=None))
>>> b1.itm.value = 1
>>> b2 = ttypes.B()
>>> b2
B(itm=A(value=1)){code}

> Python compiler generates inoperable definitions for default-valued classes 
> in same thrift file
> -----------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-4623
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4623
>             Project: Thrift
>          Issue Type: Bug
>          Components: Python - Compiler
>    Affects Versions: 0.11.0
>            Reporter: Matt Anthony
>            Priority: Major
>
> Consider a thrift file as
>  
> <code>
> struct A {
>     i32 value;
> }
>  
> struct B {
>     A itm = {}
> }
> </code>
>  
> The thrift compiler will generate class definitions for A and B, without 
> `self.thrift_spec` defined, and at the end of the ttypes.py file will go back 
> and populate the thrift_spec objects. However, in the __init__ method of B, 
> the default value for `itm` would attempt to be set as `A(**{})`, which will 
> crash with error `AttributeError: 'ObservationInfo' object has no attribute 
> 'thrift_spec'`. This makes sense since at the time the default object is 
> being established, there is no thrift_spec object.
> Removing the default value removes the error, but this is not correct 
> behavior. The most obvious fix is that the `thrift_spec` object of each class 
> needs to be defined within the class as the class is written, not at the end 
> of the file after all the class objects are established. Moreover, that is 
> generally good practice and is actually part of the PEP prescriptions for 
> python (referencing objects before initialization in a class is a highlighted 
> warning, for this very reason).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to