[ 
https://issues.apache.org/jira/browse/THRIFT-5715?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Katie Atkinson updated THRIFT-5715:
-----------------------------------
    Description: 
Generated Thrift IDLs create exceptions that are immutable. In Python 3.11 
contextlib manipulates exceptions to update tracebacks. When a Thrift client 
raises an error within a context manager the context manager fails. This 
doesn't happen with Python 3.10.

This example uses 
[tutorial.thrift|https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift].
 I compiled the IDL with versions v0.14.1, v0.16. and v0.18.1, each with the 
same result.

 
{code:java}
// contextmanager.py
import contextlib
import syssys.path.append('gen-py')
from tutorial.ttypes import InvalidOperation

@contextlib.contextmanager
def example():
    yield
    return

def main():
    with example():
        raise InvalidOperation

if __name__ == "__main__":
    main() {code}
 

 
{code:java}
# Run in script in Python 3.11

py (master) $ docker run -it --rm --volume /home/katie/python/thrift:/code 
--workdir /code/tutorial/py python:3.11 /bin/sh -c "pip install thrift && 
python contextmanager.py" 
Collecting thrift
  Downloading thrift-0.16.0.tar.gz (59 kB)
[?25l     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m0.0/59.6 kB[0m 
[31m?[0m eta [36m-:--:--[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
[32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
[32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m59.6/59.6 kB[0m 
[31m535.6 kB/s[0m eta [36m0:00:00[0m
[?25h  Preparing metadata (setup.py) ... [?25l- done
[?25hCollecting six>=1.7.2
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Building wheels for collected packages: thrift
  Building wheel for thrift (setup.py) ... [?25l- \ | / - \ done
[?25h  Created wheel for thrift: 
filename=thrift-0.16.0-cp311-cp311-linux_x86_64.whl size=509416 
sha256=29702930fd4c49e8f70b568ae03ab3a2a0e46ce92c620ec6a7113432fb59d9e5
  Stored in directory: 
/root/.cache/pip/wheels/29/6e/43/fe5a143fd6ed0ca5c385a5dba8a445de49cb3e66013095074d
Successfully built thrift
Installing collected packages: six, thrift
Successfully installed six-1.16.0 thrift-0.16.0
[33mWARNING: Running pip as the 'root' user can result in broken permissions 
and conflicting behaviour with the system package manager. It is recommended to 
use a virtual environment instead: https://pip.pypa.io/warnings/venv[0m[33m
[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip available: 
[0m[31;49m22.3.1[0m[39;49m -> [0m[32;49m23.1.2[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip 
install --upgrade pip[0m
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/contextlib.py", line 155, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/code/tutorial/py/server_in_wrapper.py", line 9, in example
    yield
  File "/code/tutorial/py/server_in_wrapper.py", line 14, in main
    raise InvalidOperation
tutorial.ttypes.InvalidOperation: InvalidOperation(whatOp=None, why=None)During 
handling of the above exception, another exception occurred:Traceback (most 
recent call last):
  File "/code/tutorial/py/server_in_wrapper.py", line 17, in <module>
    main()
  File "/code/tutorial/py/server_in_wrapper.py", line 13, in main
    with example():
  File "/usr/local/lib/python3.11/contextlib.py", line 188, in __exit__
    exc.__traceback__ = traceback
    ^^^^^^^^^^^^^^^^^
  File "/code/tutorial/py/gen-py/tutorial/ttypes.py", line 160, in __setattr__
    raise TypeError("can't modify immutable instance")
TypeError: can't modify immutable instance
{code}
 

 
{code:java}
# Running same script in Python 3.10

py (master) $ docker run -it --rm --volume /home/katie/python/thrift:/code 
--workdir /code/tutorial/py python:3.10 /bin/sh -c "pip install thrift && 
python contextmanager.py"
Collecting thrift
  Downloading thrift-0.16.0.tar.gz (59 kB)
[?25l     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m0.0/59.6 kB[0m 
[31m?[0m eta [36m-:--:--[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
[32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━[0m 
[32m41.0/59.6 kB[0m [31m479.1 kB/s[0m eta [36m0:00:01[0m
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m59.6/59.6 kB[0m 
[31m566.4 kB/s[0m eta [36m0:00:00[0m
[?25h  Preparing metadata (setup.py) ... [?25l- done
[?25hCollecting six>=1.7.2
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Building wheels for collected packages: thrift
  Building wheel for thrift (setup.py) ... [?25l- \ | / - \ done
[?25h  Created wheel for thrift: 
filename=thrift-0.16.0-cp310-cp310-linux_x86_64.whl size=464691 
sha256=33b5b5fa6663ddaa6d1a122e0a660ef23f240a1f640beed412a6425183b6f2f9
  Stored in directory: 
/root/.cache/pip/wheels/52/f8/d2/acfd995e8247eb0cad372fa6a640a5fcf279ab2ed7c5c4490e
Successfully built thrift
Installing collected packages: six, thrift
Successfully installed six-1.16.0 thrift-0.16.0
[33mWARNING: Running pip as the 'root' user can result in broken permissions 
and conflicting behaviour with the system package manager. It is recommended to 
use a virtual environment instead: https://pip.pypa.io/warnings/venv[0m[33m
[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip is available: 
[0m[31;49m23.0.1[0m[39;49m -> [0m[32;49m23.1.2[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip 
install --upgrade pip[0m
Traceback (most recent call last):
  File "/code/tutorial/py/server_in_wrapper.py", line 17, in <module>
    main()
  File "/code/tutorial/py/server_in_wrapper.py", line 14, in main
    raise InvalidOperation
tutorial.ttypes.InvalidOperation: InvalidOperation(whatOp=None, why=None)

 {code}
 

 The problematic code generated by the compiler is this code:
{code:java}
// code placeholder
144 class InvalidOperation(TException):                                     
...
159     def __setattr__(self, *args):                                       160 
        raise TypeError("can't modify immutable instance"){code}

  was:
Generated Thrift IDLs create exceptions that are immutable. In Python 3.11 
contextlib manipulates exceptions to update tracebacks. When a Thrift client 
raises an error within a context manager the context manager fails. This 
doesn't happen with Python 3.10.

This example uses 
[tutorial.thrift|https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift].
 I compiled the IDL with versions v0.14.1, v0.16. and v0.18.1, each with the 
same result.

 
{code:java}
// contextmanager.py
import contextlib
import syssys.path.append('gen-py')
from tutorial.ttypes import InvalidOperation

@contextlib.contextmanager
def example():
    yield
    return

def main():
    with example():
        raise InvalidOperation

if __name__ == "__main__":
    main() {code}
 

 
{code:java}
# Run in script in Python 3.11

py (master) $ docker run -it --rm --volume /home/katie/python/thrift:/code 
--workdir /code/tutorial/py python:3.11 /bin/sh -c "pip install thrift && 
python contextmanager.py" 
Collecting thrift
  Downloading thrift-0.16.0.tar.gz (59 kB)
[?25l     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m0.0/59.6 kB[0m 
[31m?[0m eta [36m-:--:--[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
[32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
[32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m59.6/59.6 kB[0m 
[31m535.6 kB/s[0m eta [36m0:00:00[0m
[?25h  Preparing metadata (setup.py) ... [?25l- done
[?25hCollecting six>=1.7.2
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Building wheels for collected packages: thrift
  Building wheel for thrift (setup.py) ... [?25l- \ | / - \ done
[?25h  Created wheel for thrift: 
filename=thrift-0.16.0-cp311-cp311-linux_x86_64.whl size=509416 
sha256=29702930fd4c49e8f70b568ae03ab3a2a0e46ce92c620ec6a7113432fb59d9e5
  Stored in directory: 
/root/.cache/pip/wheels/29/6e/43/fe5a143fd6ed0ca5c385a5dba8a445de49cb3e66013095074d
Successfully built thrift
Installing collected packages: six, thrift
Successfully installed six-1.16.0 thrift-0.16.0
[33mWARNING: Running pip as the 'root' user can result in broken permissions 
and conflicting behaviour with the system package manager. It is recommended to 
use a virtual environment instead: https://pip.pypa.io/warnings/venv[0m[33m
[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip available: 
[0m[31;49m22.3.1[0m[39;49m -> [0m[32;49m23.1.2[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip 
install --upgrade pip[0m
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/contextlib.py", line 155, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/code/tutorial/py/server_in_wrapper.py", line 9, in example
    yield
  File "/code/tutorial/py/server_in_wrapper.py", line 14, in main
    raise InvalidOperation
tutorial.ttypes.InvalidOperation: InvalidOperation(whatOp=None, why=None)During 
handling of the above exception, another exception occurred:Traceback (most 
recent call last):
  File "/code/tutorial/py/server_in_wrapper.py", line 17, in <module>
    main()
  File "/code/tutorial/py/server_in_wrapper.py", line 13, in main
    with example():
  File "/usr/local/lib/python3.11/contextlib.py", line 188, in __exit__
    exc.__traceback__ = traceback
    ^^^^^^^^^^^^^^^^^
  File "/code/tutorial/py/gen-py/tutorial/ttypes.py", line 160, in __setattr__
    raise TypeError("can't modify immutable instance")
TypeError: can't modify immutable instance
{code}
 

 
{code:java}
# Running same script in Python 3.10

py (master) $ docker run -it --rm --volume /home/katie/python/thrift:/code 
--workdir /code/tutorial/py python:3.10 /bin/sh -c "pip install thrift && 
python contextmanager.py"
Collecting thrift
  Downloading thrift-0.16.0.tar.gz (59 kB)
[?25l     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m0.0/59.6 kB[0m 
[31m?[0m eta [36m-:--:--[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
[32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
[2K     [91m━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━[0m 
[32m41.0/59.6 kB[0m [31m479.1 kB/s[0m eta [36m0:00:01[0m
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m59.6/59.6 kB[0m 
[31m566.4 kB/s[0m eta [36m0:00:00[0m
[?25h  Preparing metadata (setup.py) ... [?25l- done
[?25hCollecting six>=1.7.2
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Building wheels for collected packages: thrift
  Building wheel for thrift (setup.py) ... [?25l- \ | / - \ done
[?25h  Created wheel for thrift: 
filename=thrift-0.16.0-cp310-cp310-linux_x86_64.whl size=464691 
sha256=33b5b5fa6663ddaa6d1a122e0a660ef23f240a1f640beed412a6425183b6f2f9
  Stored in directory: 
/root/.cache/pip/wheels/52/f8/d2/acfd995e8247eb0cad372fa6a640a5fcf279ab2ed7c5c4490e
Successfully built thrift
Installing collected packages: six, thrift
Successfully installed six-1.16.0 thrift-0.16.0
[33mWARNING: Running pip as the 'root' user can result in broken permissions 
and conflicting behaviour with the system package manager. It is recommended to 
use a virtual environment instead: https://pip.pypa.io/warnings/venv[0m[33m
[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip is available: 
[0m[31;49m23.0.1[0m[39;49m -> [0m[32;49m23.1.2[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip 
install --upgrade pip[0m
Traceback (most recent call last):
  File "/code/tutorial/py/server_in_wrapper.py", line 17, in <module>
    main()
  File "/code/tutorial/py/server_in_wrapper.py", line 14, in main
    raise InvalidOperation
tutorial.ttypes.InvalidOperation: InvalidOperation(whatOp=None, why=None)

 {code}
 

 

 


> Immutable errors can't be used with contextlib.contextmanager in Python 3.11
> ----------------------------------------------------------------------------
>
>                 Key: THRIFT-5715
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5715
>             Project: Thrift
>          Issue Type: Bug
>          Components: Python - Compiler
>    Affects Versions: 0.14.1, 0.16.0, 0.18.1
>         Environment: The client runtime is the python:3.10 and python:3.11 
> docker images from dockerhub, installing the latest thrift library from pypi.
>  
> The thrift compiler is installed on debian (v0.14.1 and v0.18.1) or ubuntu 
> (v0.16.0).
>            Reporter: Katie Atkinson
>            Priority: Major
>
> Generated Thrift IDLs create exceptions that are immutable. In Python 3.11 
> contextlib manipulates exceptions to update tracebacks. When a Thrift client 
> raises an error within a context manager the context manager fails. This 
> doesn't happen with Python 3.10.
> This example uses 
> [tutorial.thrift|https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift].
>  I compiled the IDL with versions v0.14.1, v0.16. and v0.18.1, each with the 
> same result.
>  
> {code:java}
> // contextmanager.py
> import contextlib
> import syssys.path.append('gen-py')
> from tutorial.ttypes import InvalidOperation
> @contextlib.contextmanager
> def example():
>     yield
>     return
> def main():
>     with example():
>         raise InvalidOperation
> if __name__ == "__main__":
>     main() {code}
>  
>  
> {code:java}
> # Run in script in Python 3.11
> py (master) $ docker run -it --rm --volume /home/katie/python/thrift:/code 
> --workdir /code/tutorial/py python:3.11 /bin/sh -c "pip install thrift && 
> python contextmanager.py" 
> Collecting thrift
>   Downloading thrift-0.16.0.tar.gz (59 kB)
> [?25l     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m0.0/59.6 kB[0m 
> [31m?[0m eta [36m-:--:--[0m
> [2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
> [32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
> [2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
> [32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
> [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m59.6/59.6 kB[0m 
> [31m535.6 kB/s[0m eta [36m0:00:00[0m
> [?25h  Preparing metadata (setup.py) ... [?25l- done
> [?25hCollecting six>=1.7.2
>   Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
> Building wheels for collected packages: thrift
>   Building wheel for thrift (setup.py) ... [?25l- \ | / - \ done
> [?25h  Created wheel for thrift: 
> filename=thrift-0.16.0-cp311-cp311-linux_x86_64.whl size=509416 
> sha256=29702930fd4c49e8f70b568ae03ab3a2a0e46ce92c620ec6a7113432fb59d9e5
>   Stored in directory: 
> /root/.cache/pip/wheels/29/6e/43/fe5a143fd6ed0ca5c385a5dba8a445de49cb3e66013095074d
> Successfully built thrift
> Installing collected packages: six, thrift
> Successfully installed six-1.16.0 thrift-0.16.0
> [33mWARNING: Running pip as the 'root' user can result in broken permissions 
> and conflicting behaviour with the system package manager. It is recommended 
> to use a virtual environment instead: https://pip.pypa.io/warnings/venv[0m[33m
> [0m
> [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip available: 
> [0m[31;49m22.3.1[0m[39;49m -> [0m[32;49m23.1.2[0m
> [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip 
> install --upgrade pip[0m
> Traceback (most recent call last):
>   File "/usr/local/lib/python3.11/contextlib.py", line 155, in __exit__
>     self.gen.throw(typ, value, traceback)
>   File "/code/tutorial/py/server_in_wrapper.py", line 9, in example
>     yield
>   File "/code/tutorial/py/server_in_wrapper.py", line 14, in main
>     raise InvalidOperation
> tutorial.ttypes.InvalidOperation: InvalidOperation(whatOp=None, 
> why=None)During handling of the above exception, another exception 
> occurred:Traceback (most recent call last):
>   File "/code/tutorial/py/server_in_wrapper.py", line 17, in <module>
>     main()
>   File "/code/tutorial/py/server_in_wrapper.py", line 13, in main
>     with example():
>   File "/usr/local/lib/python3.11/contextlib.py", line 188, in __exit__
>     exc.__traceback__ = traceback
>     ^^^^^^^^^^^^^^^^^
>   File "/code/tutorial/py/gen-py/tutorial/ttypes.py", line 160, in __setattr__
>     raise TypeError("can't modify immutable instance")
> TypeError: can't modify immutable instance
> {code}
>  
>  
> {code:java}
> # Running same script in Python 3.10
> py (master) $ docker run -it --rm --volume /home/katie/python/thrift:/code 
> --workdir /code/tutorial/py python:3.10 /bin/sh -c "pip install thrift && 
> python contextmanager.py"
> Collecting thrift
>   Downloading thrift-0.16.0.tar.gz (59 kB)
> [?25l     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m0.0/59.6 kB[0m 
> [31m?[0m eta [36m-:--:--[0m
> [2K     [91m━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━━━━━━━━[0m 
> [32m30.7/59.6 kB[0m [31m1.2 MB/s[0m eta [36m0:00:01[0m
> [2K     [91m━━━━━━━━━━━━━━━━━━━━━━━━━━[0m[91m╸[0m[90m━━━━━━━━━━━━[0m 
> [32m41.0/59.6 kB[0m [31m479.1 kB/s[0m eta [36m0:00:01[0m
> [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m59.6/59.6 kB[0m 
> [31m566.4 kB/s[0m eta [36m0:00:00[0m
> [?25h  Preparing metadata (setup.py) ... [?25l- done
> [?25hCollecting six>=1.7.2
>   Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
> Building wheels for collected packages: thrift
>   Building wheel for thrift (setup.py) ... [?25l- \ | / - \ done
> [?25h  Created wheel for thrift: 
> filename=thrift-0.16.0-cp310-cp310-linux_x86_64.whl size=464691 
> sha256=33b5b5fa6663ddaa6d1a122e0a660ef23f240a1f640beed412a6425183b6f2f9
>   Stored in directory: 
> /root/.cache/pip/wheels/52/f8/d2/acfd995e8247eb0cad372fa6a640a5fcf279ab2ed7c5c4490e
> Successfully built thrift
> Installing collected packages: six, thrift
> Successfully installed six-1.16.0 thrift-0.16.0
> [33mWARNING: Running pip as the 'root' user can result in broken permissions 
> and conflicting behaviour with the system package manager. It is recommended 
> to use a virtual environment instead: https://pip.pypa.io/warnings/venv[0m[33m
> [0m
> [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip is 
> available: [0m[31;49m23.0.1[0m[39;49m -> [0m[32;49m23.1.2[0m
> [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip 
> install --upgrade pip[0m
> Traceback (most recent call last):
>   File "/code/tutorial/py/server_in_wrapper.py", line 17, in <module>
>     main()
>   File "/code/tutorial/py/server_in_wrapper.py", line 14, in main
>     raise InvalidOperation
> tutorial.ttypes.InvalidOperation: InvalidOperation(whatOp=None, why=None)
>  {code}
>  
>  The problematic code generated by the compiler is this code:
> {code:java}
> // code placeholder
> 144 class InvalidOperation(TException):                                     
> ...
> 159     def __setattr__(self, *args):                                       
> 160         raise TypeError("can't modify immutable instance"){code}



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

Reply via email to