Hello I removed some assert calls in distutils some time ago because the package was not behaving correctly when people were using Python with the --optimize flag. In other words, assert became a full part of the code logic and removing them via -O was changing the behavior.
In my opinion assert should be avoided completely anywhere else than in the tests. If this is a wrong statement, please let me know why :) So, I grepped the stdlib for assert calls, and I have found 177 of them and many of them are making Python acts differently depending on the -O flag, Here's an example on a randomly picked assert in the threading module: >>>>>>>>>>>>>>>>>>>>>>>> import threading class test(threading.Thread): def __init__(self): self.bla = 1 def run(self): print('running') t = test() print(t) <<<<<<<<<<<<<<<<<<<<<< The __repr__ method is not behaving the same way depending on the O flag: $ python3 -O test.py Traceback (most recent call last): File "test.py", line 12, in <module> print(t) File "/usr/local/lib/python3.2/threading.py", line 652, in __repr__ if self._started.is_set(): AttributeError: 'test' object has no attribute '_started' $ python3 test.py Traceback (most recent call last): File "test.py", line 12, in <module> print(t) File "/usr/local/lib/python3.2/threading.py", line 650, in __repr__ assert self._initialized, "Thread.__init__() was not called" AttributeError: 'test' object has no attribute '_initialized' $ python test.py Traceback (most recent call last): File "test.py", line 12, in <module> print(t) File "/usr/lib/python2.6/threading.py", line 451, in __repr__ assert self.__initialized, "Thread.__init__() was not called" AssertionError: Thread.__init__() was not called <--- oops different error $ python -O test.py Traceback (most recent call last): File "test.py", line 12, in <module> print(t) File "/usr/lib/python2.6/threading.py", line 453, in __repr__ if self.__started.is_set(): AttributeError: 'test' object has no attribute '_Thread__started' I have seen some other places where thing would simply break with -O. Am I right thinking we should do a pass on those and remove them or turn them into exception that are triggered with -O as well ? This flag is meant to "optimize generated bytecode slightly", but I am not sure this involves also slightly changing the way the code behaves Cheers Tarek -- Tarek Ziadé | http://ziade.org _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com