mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Suggest people use feature detection in porting guide
This commit is contained in:
		
							parent
							
								
									62564dbb4b
								
							
						
					
					
						commit
						adcb654519
					
				
					 1 changed files with 46 additions and 0 deletions
				
			
		| 
						 | 
					@ -282,6 +282,50 @@ To summarize:
 | 
				
			||||||
   appropriate
 | 
					   appropriate
 | 
				
			||||||
#. Be careful when indexing binary data
 | 
					#. Be careful when indexing binary data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use feature detection instead of version detection
 | 
				
			||||||
 | 
					++++++++++++++++++++++++++++++++++++++++++++++++++
 | 
				
			||||||
 | 
					Inevitably you will have code that has to choose what to do based on what
 | 
				
			||||||
 | 
					version of Python is running. The best way to do this is with feature detection
 | 
				
			||||||
 | 
					of whether the version of Python you're running under supports what you need.
 | 
				
			||||||
 | 
					If for some reason that doesn't work then you should make the version check is
 | 
				
			||||||
 | 
					against Python 2 and not Python 3. To help explain this, let's look at an
 | 
				
			||||||
 | 
					example.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Let's pretend that you need access to a feature of importlib_ that
 | 
				
			||||||
 | 
					is available in Python's standard library since Python 3.3 and available for
 | 
				
			||||||
 | 
					Python 2 through importlib2_ on PyPI. You might be tempted to write code to
 | 
				
			||||||
 | 
					access e.g. the ``importlib.abc`` module by doing the following::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if sys.version[0] == 3:
 | 
				
			||||||
 | 
					      from importlib import abc
 | 
				
			||||||
 | 
					  else:
 | 
				
			||||||
 | 
					      from importlib2 import abc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The problem with this code is what happens when Python 4 comes out? It would
 | 
				
			||||||
 | 
					be better to treat Python 2 as the exceptional case instead of Python 3 and
 | 
				
			||||||
 | 
					assume that future Python versions will be more compatible with Python 3 than
 | 
				
			||||||
 | 
					Python 2::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if sys.version[0] > 2:
 | 
				
			||||||
 | 
					      from importlib import abc
 | 
				
			||||||
 | 
					  else:
 | 
				
			||||||
 | 
					      from importlib2 import abc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The best solution, though, is to do no version detection at all and instead rely
 | 
				
			||||||
 | 
					on feature detection. That avoids any potential issues of getting the version
 | 
				
			||||||
 | 
					detection wrong and helps keep you future-compatible::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try:
 | 
				
			||||||
 | 
					      from importlib import abc
 | 
				
			||||||
 | 
					  except ImportError:
 | 
				
			||||||
 | 
					      from importlib2 import abc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Prevent compatibility regressions
 | 
					Prevent compatibility regressions
 | 
				
			||||||
---------------------------------
 | 
					---------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -381,6 +425,8 @@ supported by Python 2. You should also update the classifiers in your
 | 
				
			||||||
.. _cheat sheet: http://python-future.org/compatible_idioms.html
 | 
					.. _cheat sheet: http://python-future.org/compatible_idioms.html
 | 
				
			||||||
.. _coverage.py: https://pypi.python.org/pypi/coverage
 | 
					.. _coverage.py: https://pypi.python.org/pypi/coverage
 | 
				
			||||||
.. _Futurize: http://python-future.org/automatic_conversion.html
 | 
					.. _Futurize: http://python-future.org/automatic_conversion.html
 | 
				
			||||||
 | 
					.. _importlib: https://docs.python.org/3/library/importlib.html#module-importlib
 | 
				
			||||||
 | 
					.. _importlib2: https://pypi.python.org/pypi/importlib2
 | 
				
			||||||
.. _Modernize: http://python-modernize.readthedocs.org/en/latest/
 | 
					.. _Modernize: http://python-modernize.readthedocs.org/en/latest/
 | 
				
			||||||
.. _Porting to Python 3: http://python3porting.com/
 | 
					.. _Porting to Python 3: http://python3porting.com/
 | 
				
			||||||
.. _Pylint: https://pypi.python.org/pypi/pylint
 | 
					.. _Pylint: https://pypi.python.org/pypi/pylint
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue