.. _chap2to3:

==========================================
\ :py:mod:`2to3`\ 繝��繝ォ縺ョ菴ソ縺�婿
==========================================

:py:mod:`2to3`\ 縺ョ讎りヲ�
+++++++++++++++++++++++++++++++++++++++++++++++++
.. |2to3| replace:: :py:mod:`2to3` 
		    
.. |fixer| replace:: https://docs.python.org/ja/3/library/2to3.html#fixers

|2to3| 縺ッPython縺ィ蜈ア縺ォ繧、繝ウ繧ケ繝医�繝ォ縺輔l繧� **讓呎コ也噪縺ェ繝��繝ォ** 縺ァ縲�
縺昴�蜷阪�騾壹jPython2蜷代¢縺ョ繧ス繝シ繧ケ繧ウ繝シ繝峨r縲 ̄ython3蟇セ蠢懊�繧ス繝シ繧ケ繧ウ繝シ繝峨↓
螟画鋤縺励※縺上l縺セ縺吶€ょセ後↓隱ャ譏弱☆繧� :py:mod:`future` 繝「繧ク繝・繝シ繝ォ繧る。樔シシ縺ョ讖溯�繧呈戟縺、縺ヲ縺�∪縺�(:any:`future_module` 蜿ら�)縲�

\ |2to3|\ 縺ッpython2蟇セ蠢懊さ繝シ繝峨rpython3蟇セ蠢懊さ繝シ繝峨↓
螟画鋤縺吶k髫帙↓蠢�ヲ√↑螟画峩縺ョ縺サ縺ィ繧薙←縺ォ蟇セ蠢懊@縺ヲ縺�∪縺吶′縲∬凶蟷イ縺ョ謇狗峩縺励r
蠢�ヲ√→縺吶k蝣エ蜷医′縺ゅj縺セ縺吶€�
縺励°縺励↑縺後i縲 ̄ython2蜷代¢繧ス繝シ繧ケ繧ウ繝シ繝峨r
Python3蟇セ蠢懊↓縺吶k轤コ縺ョ譛€蛻昴�荳€豁ゥ縺ィ縺励※縺ッ蠢��医�繝��繝ォ縺ァ縺吶€�

:py:mod:`future` 繝「繧ク繝・繝シ繝ォ縺ョ futureize 繧ウ繝槭Φ繝峨d Modernize 繧ウ繝槭Φ繝峨b蜀�Κ縺ァ縺ッlib2to3縺ョ讖溯�繧剃スソ縺」縺ヲ縺�∪縺吶€�

.. hint:: 蜿り€ザRL
   :name: future 繝「繧ク繝・繝シ繝ォ縺ォ縺、縺�※縺ョ繝峨く繝・繝。繝ウ繝�(URL)

   `python-modernize <https://python-modernize.readthedocs.io/en/latest/>`_

   `Automatic conversion to Py2/3 <https://python-future.org/automatic_conversion.html>`_

   `How to port Python 2 Code to Python 3 <https://docs.python.org/ja/3/howto/pyporting.html>`_


:py:mod:`2to3`\ 縺ョ蝓コ譛ャ逧�↑菴ソ縺�婿
+++++++++++++++++++++++++++++++++++++++++++++++++


|2to3|\  縺悟、画峩縺輔l縺滓枚豕輔�縺ゥ繧後↓蟇セ蠢懊@縺ヲ縺�k縺九�縲�

.. code-block:: bash
   
   2to3 -l

繧貞ョ溯。後☆繧九%縺ィ縺ァ遒コ隱阪〒縺阪∪縺吶€�
縺薙�譁�ォ�菴懈�譎ゅ↓螳溯。後@縺溘→縺薙m縲�52縺ョ螟画鋤鬆�岼�亥、画鋤繧オ繝悶�繝ュ繧ー繝ゥ繝�縺ォ蟇セ蠢懊@縺ヲ縺�k�峨′謖吶£繧峨l縺セ縺励◆縲� [#]_

.. [#] 2to3-3.10縺ァ繧ゅ%縺ョ謨ー(52)縺ッ蜷後§縺ァ縺励◆縲�
   

.. hlist::
   :columns: 5
	     
   * apply
   * asserts
   * basestring
   * *buffer*
   * dict
   * except
   * exec
   * execfile
   * exitfunc
   * filter
   * funcattrs
   * future
   * getcwdu
   * has_key
   * *idioms*
   * import
   * imports
   * imports2
   * input
   * intern
   * isinstance
   * itertools
   * itertools_imports
   * long
   * map
   * metaclass
   * methodattrs
   * ne
   * next
   * nonzero
   * numliterals
   * operator
   * paren
   * print
   * raise
   * raw_input
   * reduce
   * reload
   * renames
   * repr
   * *set_literal*
   * standarderror
   * sys_exc
   * throw
   * tuple_params
   * types
   * unicode
   * urllib
   * *ws_comma*
   * xrange
   * xreadlines
   * zip

縺薙l繧峨�螟画鋤鬆�岼縺ッ "``-f``"繧ェ繝励す繝ァ繝ウ繧�"``-x``"繧ェ繝励す繝ァ繝ウ繧定ソス蜉�縺吶k縺薙→縺ァ縲∵�遉コ逧�↓螟画鋤鬆�岼縺ォ譛牙柑蛹厄シ冗┌蜉ケ蛹悶r謖�ョ壹〒縺阪∪縺吶€�
縺薙l繧峨�螟画鋤鬆�岼縺ョ縺�¥縺、縺具シ� *buffer*, *idioms*, *set_lieteral*, *ws_comma* )縺ッ繧ェ繝励す繝ァ繝翫Ν縺ェ螟画鋤鬆�岼縺ィ縺ェ縺」縺ヲ縺翫j縲�€壼クク縺ッ辟。蜉ケ蛹悶&繧後※縺�∪縺吶€�
縺薙l繧峨�螟画鋤鬆�岼縺ォ繧医k邨先棡縺ッ縲∝宍蟇�↓遲我セ。縺ェ繝励Ο繧ー繝ゥ繝�繧剃ク弱∴繧玖ィウ縺ァ縺ッ辟。縺�%縺ィ縺九i縲√が繝励す繝ァ繝翫Ν縺ェ螟画鋤鬆�岼縺ィ縺ェ縺」縺ヲ縺�k繧医≧縺ァ縺吶€�

\ ``-f``\ 繧剃スソ縺」縺ヲ螟画鋤鬆�岼繧呈欠螳壹☆繧九→縲∵�遉コ逧�↓謖�ョ壹@縺溷、画鋤鬆�岼縺�縺代′譛牙柑蛹悶&繧後∪縺吶€よ里螳壹�螟画鋤鬆�岼縺ォ螟画鋤鬆�岼繧定ソス蜉�縺吶k縺ォ縺ッ縲�

.. code-block:: bash
		
   2to3 -f all -f <螟画鋤鬆�岼蜷�> .
    
縺ィ縺励∪縺吶€�



螟画鋤鬆�岼(螟画鋤繝励Ο繧ー繝ゥ繝�)
-------------------------

荳翫↓縺ゅ£縺溷、画鋤鬆�岼(apply,...) 縺ョ蜀�ョケ縺ッ縲∽セ九∴縺ー
\ https://docs.python.org/ja/3/library/2to3.html#fixers\
縺ォ隱ャ譏弱&繧後※縺�∪縺吶€�

縺薙l繧峨�螟画鋤繝励Ο繧ー繝ゥ繝�縺ョ縺�■縲�
``imports/imports2`` 縺ッ ``python2`` 縺九i ``python3`` 縺ク縺ョ遘サ陦梧凾縺ォ繝「繧ク繝・繝シ繝ォ蜷阪′螟画峩縺輔l縺溘Δ繧ク繝・繝シ繝ォ(萓九∴縺ーTkinter -> tkinter)縺ォ蟇セ蠢懊@縺ヲ縺上l縺セ縺吶€�
imports縺ァ縺ッ縲ゝkinter, FileDialo, Tix, ttk 縺ェ縺ゥ縺ョTk髢「菫ゅ�繝「繧ク繝・繝シ繝ォ縲‥bm縺ォ髢「騾」縺励◆繝「繧ク繝・繝シ繝ォ, xmlrpc繧オ繝シ繝宣未菫ゅ�繝「繧ク繝・繝シ繝ォ縲�
httplib繧ЗTTPServer縺ォ髢「騾」縺励◆繝「繧ク繝・繝シ繝ォ縺ェ縺ゥ縺ォ蟇セ蠢懊@縺ヲ縺�∪縺吶€�
縺セ縺溘€(mports2縺ァ縺ッwhichdbm, anydbm縺ョ菴ソ逕ィ縺慧bm繝「繧ク繝・繝シ繝ォ繧剃スソ縺�h縺�↓螟画峩縺輔l縺セ縺吶€�
imports縺ィimports2縺ォ蛻�屬縺輔l縺ヲ縺�k縺ョ縺ッ縲�"蜊倥↓謚€陦鍋噪縺ェ蛻カ邏��縺溘a" 縺�縺昴≧縺ァ縺吶€�

``urllib`` 縺ォ縺、縺�※縺ッ ``imports`` 縺ィ縺ッ蛻・縺ォ螟画鋤繝励Ο繧ー繝ゥ繝� ``urllib``��fix_urllib.py)縺檎畑諢上&繧後※縺�∪縺吶€�

``idioms`` 螟画鋤繝励Ο繧ー繝ゥ繝�縺ッ縲�"Python 繧ウ繝シ繝峨r繧医j Python 繧峨@縺�嶌縺肴婿" 縺ォ縺吶k縺�¥縺、縺九�螟牙ス「繧定。後>縺セ縺吶€�
object縺ョ蝙欺 :code:`type(obj)`\ 縺ィType繧ェ繝悶ず繧ァ繧ッ繝�\ :code:`T`\ 縺ィ縺ョ
豈碑シ�r縲∝庄閭ス縺ェ縺ィ縺薙m縺ァ縺ッ縲― :code:`isInstance(obj,T)`\ 縺ォ鄂ョ縺肴鋤縺医k縲�
\ :code:`while 1:`\ 繧箪 :code:`while True:`\ 縺ォ鄂ョ縺肴鋤縺医k縲�
蜿ッ閭ス縺ェ蝣エ謇€縺ァ縺ッ\ :code:`sorted(EXPR)`\ 繧剃スソ縺�€∫ュ峨�螟画鋤繧定。後>縺セ縺吶€�


Tab縺ィ繧ケ繝壹�繧ケ
------------------
http://python3porting.com/differences.html#index-14 縺ォ縺ッ谺。縺ョ險倩シ峨′縺ゅj縺セ縺吶€�

In Python 2 a tab will be equal to eight spaces as indentation, so you can indent one line with a tab, and the next line with eight spaces. This is confusing if you are using an editor that expands tabs to another number than eight spaces.

In Python 3 a tab is only equal to another tab. This means that each indentation level has to be consistent in its use of tabs and spaces. If you have a file where an indented block sometimes uses spaces and sometimes tabs, you will get the error TabError: inconsistent use of tabs and spaces in indentation.

縺、縺セ繧翫€}ython2縺ァ縺ッ 荳€縺、縺ョ繝悶Ο繝�け荳ュ縺ァ tab縺ィspace繧呈キキ蝨ィ縺励※繧ゅ€》ab縺ィspace縺ョ髢「菫�( 1 tab = 8 spaces)繧剃スソ縺」縺ヲ繝悶Ο繝�け蜀�
縺ョ蜷�。後�蟋九∪繧翫′荳€閾エ縺励※縺�l縺ー蝠城。後�縺ゅj縺セ縺帙s縺ァ縺励◆縲�
荳€譁ケpython3 縺ァ縺ッ縲∝酔縺倥ヶ繝ュ繝�け縺ョ荳ュ縺ァ縺ッ縲》ab縺ィ繧ケ繝壹�繧ケ縺ョ謨ー縺ィ菴咲スョ縺御ク€閾エ縺励※縺�k蠢�ヲ√′縺ゅj縺セ縺吶€�

縺薙�縺溘a縲∝酔縺倥ヶ繝ュ繝�け蜀�〒tab縺ィ繧ケ繝壹�繧ケ縺ョ謨ー縺檎焚縺ェ繧玖。後′縺ゅk繧ケ繧ッ繝ェ繝励ヨ縺ァ縺ッ縲}ython2縺ァ縺ッ蜍穂ス懊☆繧九¢繧後←縲}ython3縺ァ縺ッ蜍穂ス懊@縺ェ縺�%縺ィ縺ォ縺ェ繧翫∪縺吶€�

TAB縺ィ遨コ逋ス縺ョ豺キ蝨ィ縺ッ繧ィ繝�ぅ繧ソ縺ェ縺ゥ縺ョ迺ー蠅��驕輔>縺ォ繧医▲縺ヲ縲∬ヲ九°縺台ク翫�讒矩€�縺ィ
Python繧、繝ウ繧ソ繝励Μ繧ソ縺九i縺ソ縺滓ァ矩€�縺檎焚縺ェ繧句�エ蜷医′縺ゅj縺セ縺吶€�
縺薙l縺ッpython2縺ォ縺翫>縺ヲ繧ょ酔讒倥〒縺吶�縺ァ縲}ython2/python3縺ォ縺九°繧上i縺啜AB縺ィ遨コ逋ス縺ョ豺キ蝨ィ縺ッ驕ソ縺代※縺翫¥縺ョ縺悟セ礼ュ悶〒縺吶€�

縺。縺ェ縺ソ縺ォ遘∬�霄ォ縺ッemacs縺ョPython-mode繧剃スソ縺аython繝励Ο繧ー繝ゥ繝�繧帝幕逋コ縺励∪縺吶€�
豁、縺ョ迺ー蠅�〒縺ッ縲√く繝シ繝懊�繝峨°繧峨�TAB蜈・蜉帙�隍�焚縺ョ遨コ逋ス縺ォ鄂ョ縺肴鋤縺医※縺上l縺セ縺吶€�
繝�ヵ繧ゥ繝ォ繝医�4蛟九�遨コ逋ス縺ァ縺吶′縲√%繧後r螟画峩縺吶k縺薙→繧ょ庄閭ス縺ァ縺�(Preference
縺ァ\ ``Python Indent Offset``\ 繧貞、画峩縺吶k)縲�



螟画峩驛ィ蛻��遒コ隱�
---------------------

|2to3|\ 繧貞�蜉帙r謖�ョ壹☆繧九が繝励す繝ァ繝ウ繧偵▽縺代★縺ォ螳溯。後☆繧九%縺ィ縺ァ縲�
|2to3|\ 縺悟刈縺医k螟画峩繧壇iff蠖「蠑上�蜃コ蜉帙〒遒コ隱阪〒縺阪∪縺吶€�


.. code-block:: bash
   
   2to3 *.py

縺ゅk縺��

.. code-block:: bash

   2to3 .
   
縺ァ迴セ蝨ィ縺ォ繝�ぅ繝ャ繧ッ繝医Μ縺ォ縺ゅkpython繧ウ繝シ繝峨〒蠢�ヲ√↑螟画鋤蜀�ョケ繧堤「コ隱阪@縺セ縺吶€�
蠢�ヲ√↓蠢懊§縺ヲ縲~`-f``縺ゅk縺��``-x``繧ェ繝励す繝ァ繝ウ繧偵▽縺代※螟画峩鬆�岼縺ョ譛牙柑蛹厄シ冗┌蜉ケ蛹悶r隧ヲ陦後@縺ヲ隕九∪縺吶€�



譁ー縺励>繝�ぅ繝ャ繧ッ繝医Μ縺ォPytho3蟇セ蠢懊た繝シ繧ケ繧ウ繝シ繝峨r菴懈�縺吶k縲�
----------------------------------------------------------------------------------------------------

|2to3|\ 縺ォ縺ッ讒倥€�↑繧ェ繝励す繝ァ繝ウ縺檎畑諢上&繧後※縺�∪縺吶′縲∵ャ。縺ョ繧キ繧ァ繝ォ繧ウ繝槭Φ繝�

.. code-block:: bash
		
   mkdir ../PY3
   2to3 -W -n -o ../PY3 .

繧堤衍縺」縺ヲ縺�l縺ー縲∵怙菴朱剞縺ョ逕ィ縺ッ雜ウ繧翫k縺ァ縺励g縺�€ゅ%縺ョ繧ウ繝槭Φ繝峨�縲�
python2縺ョ繧ス繝シ繧ケ繧ウ繝シ繝峨�繝�ぅ繝ャ繧ッ繝医Μ縺ォ迴セ蝨ィ螻�k縺ィ縺励※縲�


#. Python3逕ィ縺ョ菴懈・ュ繝�ぅ繝ャ繧ッ繝医Μ../PY3繧剃ス懈�縺励€�(mkdir ../PY3)
#. 縺昴�繝�ぅ繝ャ繧ッ繝医Μ縺ォ迴セ蝨ィ縺ョ繝�ぅ繝ャ繧ッ繝医Μ縺ォ縺ゅk蜈ィ縺ヲ縺ョPython繧ス繝シ繧ケ繧ウ繝シ繝峨r\ |2to3|\ 縺ァ蠢�ヲ√↑蝣エ蜷医↓縺ッ縲 ̄ython3蜷代¢縺ォ螟画鋤縺励€�(|2to3|\ )
#. 螟画鋤縺ョ蠢�ヲ√�辟。縺�ヵ繧。繧、繝ォ繧貞性繧√※(-W -n)
#. 譁ー縺励>繝�ぅ繝ャ繧ッ繝医Μ(../PY3)縺ォ譖ク縺榊�縺励∪縺吶€�(-o ../PY3)
#. ``-n`` 繧ェ繝励す繝ァ繝ウ縺ッ縲√が繝ェ繧ク繝翫Ν縺ョPython2蜷代¢繧ウ繝シ繝峨rbackup縺ィ縺励※菴懈�縺励↑縺�%縺ィ繧呈欠螳壹@縺ヲ縺�∪縺吶€�
    ``-n`` 繧ェ繝励す繝ァ繝ウ縺ッ ``-o`` 繧ェ繝励す繝ァ繝ウ 繧剃スソ縺�圀縺ォ縺ッ蠢��医→縺ェ縺」縺ヲ縺�∪縺吶€�

    
\ |2to3|\ 繧ウ繝槭Φ繝峨�隧ウ邏ー縺ッ縲�

.. code-block:: bash
		
   2to3 --help

縺ァ遒コ隱阪〒縺阪∪縺吶€�


mercurial縺ェ縺ゥ繧剃スソ縺」縺ヲ邂。逅�@縺ヲ縺�k蝣エ蜷�
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

繧ス繝シ繧ケ繧ウ繝シ繝峨r mercurial 縺ェ縺ゥ縺ョ邂。逅�ヤ繝シ繝ォ繧剃スソ縺」縺ヲ
邂。逅�@縺ヲ縺�k蝣エ蜷医↓縺ッ縲√ヶ繝ゥ繝ウ繝√↑縺ゥ縺ョ讖溯�繧剃スソ縺」縺ヲ縲}ython3迚医�
髢狗匱繧帝€イ繧√k縺薙→縺瑚€�∴繧峨l縺セ縺吶€�

.. code-block:: bash
   
   mkdir PY3
   cd PY3
   hg clone <repository> .
 
縺ォ繧医▲縺ヲ縲∫樟蝨ィ縺ョ繝舌�繧ク繝ァ繝ウ縺ョ繧ウ繝斐�繧剃ス懈・ュ繝�ぅ繝ャ繧ッ繝医Μ(PY3)縺ォ菴懈�縺励∪縺吶€ゅ%縺薙〒縲�

.. code-block:: bash

   2to3 -w -n .

繧貞ョ溯。後☆繧九→縲 ̄ython3縺ク縺ョ螟画峩縺悟ソ�ヲ√↑繝輔ぃ繧、繝ォ縺�縺代′\ |2to3|\ 縺ォ繧医▲縺ヲ螟画峩縺輔l縺セ縺吶€�

螟画峩蜑阪�繝輔ぃ繧、繝ォ繧偵ヰ繝�け繧「繝��縺ィ縺励※谿九@縺ヲ鄂ョ縺阪◆縺��エ蜷医↓縺ッ縲�

.. code-block:: bash
   
   2to3 -w 

縺ィ縺励∪縺吶€ゅb縺」縺ィ繧ゅ€”g縺ァ邂。逅�@縺ヲ縺�k縺ョ縺ァ縺ゅl縺ー縲”g diff縺ァ隕九k縺薙→縺後〒縺阪k縺ョ縺ァ縲√≠縺セ繧雁ソ�ヲ√↑辟。縺�h縺�↓諤昴o繧後∪縺吶€�


setup 繝��繝ォ縺ィ縺ョ騾」謳コ
-------------------------

setuptools繧剃スソ縺」縺殃nstall script縺ァ縺ッ縲~`use_2to3`` 繧ェ繝励す繝ァ繝ウ
繧定ィュ螳壹☆繧九%縺ィ縺ァ縲≫€捏etup.py intall"螳溯。梧凾縺ォ閾ェ蜍慕噪縺ォ\ |2to3|\ 繧帝←逕ィ縺励※縺九i繧、繝ウ繧ケ繝医�繝ォ縺吶k縺薙→縺後〒縺阪∪縺吶€�
蠕後〒隕九k繧医≧縺ォ縲-2to3|\ 縺ァ閾ェ蜍募、画鋤縺励◆繝励Ο繧ー繝ゥ繝�縺継ython3縺ァ縺ッ諢丞峙縺励◆蜍穂ス懊→縺ェ繧峨↑縺��エ蜷医′縺ゅk縺薙→縺九i縲√◎縺ョ譛臥畑諤ァ縺ッ縺ゅ∪繧顔┌縺��縺九b縺励l縺セ縺帙s縲� setuptools 縺ョ繝峨く繝・繝。繝ウ繝医〒繧�

.. epigraph::

   Setuptools provides a facility to invoke 2to3 on the code as a part of the build process, by setting the keyword parameter use_2to3 to True, but the Setuptools project strongly recommends instead developing a unified codebase using six, future, or another compatibility library.

   -- setuptools 45.2.0 documentation 

縺ィ縺ェ縺」縺ヲ縺�∪縺吶€ゆク€闊ャ逧�↓縺ッ縲√%縺ョ險倩ソー縺ォ繧りァヲ繧後i繧後※縺�k :py:mod:`six` 縺ゅk縺�� :py:mod:`future` 縺ェ縺ゥ縺ョ繝「繧ク繝・繝シ繝ォ繧剃スソ縺�%縺ィ縺梧耳螂ィ縺輔l縺ヲ縺�∪縺吶€ょソ�ヲ√↑螟画峩縺ョ謨ー縺悟ー代↑縺��エ蜷医↓縺ッ縲∵怏蜉ケ縺ェ譁ケ豕輔〒縺吶�縺ァ縲√ム繝。繧ゅ→縺ァ荳€蠎ヲ隧ヲ縺励※隕九k縺�縺代�萓。蛟、縺ッ譛峨j縺昴≧縺ァ縺吶€�