2018年4月30日 星期一

[ Python 常見問題 ] How can I check for Python version in a program that uses new language features?

Source From Here 
Question 
If I have a Python script that requires at least a particular version of Python, what is the correct way to fail gracefully when an earlier version of Python is used to launch the script? 

How do I get control early enough to issue an error message and exit? 

For example, I have a program that uses the ternery operator (new in 2.5) and "with" blocks (new in 2.6). I wrote a simple little interpreter-version checker routine which is the first thing the script would call ... except it doesn't get that far. Instead, the script fails during python compilation, before my routines are even called. Thus the user of the script sees some very obscure synax error tracebacks - which pretty much require an expert to deduce that it is simply the case of running the wrong version of Python. 

I know how to check the version of Python. The issue is that some syntax is illegal in older versions of Python. Consider this program: 
  1. import sys  
  2. if sys.version_info < (24):  
  3.     raise "must use python 2.5 or greater"  
  4. else:  
  5.     # syntax error in 2.4, ok in 2.5  
  6.     x = 1 if True else 2  
  7.     print x  
When run under 2.4, I want this result 
$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

and not this result: 
~/bin/python2.4 tern.py 
File "tern.py", line 5
x = 1 if True else 2
^
SyntaxError: invalid syntax

How-To 
You can test using eval
  1. try:  
  2.   eval("1 if True else 2")  
  3. except SyntaxError:  
  4.   # doesn't have ternary  
Also, with is available in Python 2.5, just add from __future__ import with_statement. To get control early enough, you could split it into different .py files and check compatibility in the main file before importing (e.g. in__init__.py in a package)

沒有留言:

張貼留言

[ Py DS ] Ch1 - IPython: Beyond Normal Python

Source From  Here   Keyboard Shortcuts in the IPython Shell   If you spend any amount of time on the computer, you’ve probably found a u...