рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдХрд╛ рд╡рд┐рднрд╛рдЬрди рд╣реИред
(x / 2 * 3.0)
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ x рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдордирдорд╛рдиреЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдХреЛрд╖реНрдардХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдХреНрд░рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ (x / 2) * 3.0
ред рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди x * (3.0 / 2)
рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдкрд░ futurize
рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ fix_division_safe
рдлрд┐рдХреНрд╕реНрдЪрд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ old_div
рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЕрдВрддрд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рдЧрд▓рдд рдХреНрд░рдо рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
$ futurize --stage2 src/example.py
RefactoringTool: Refactored src/example.py
--- src/example.py (original)
+++ src/example.py (refactored)
@@ -1 +1,3 @@
-(x / 2 * 3.0)
+from __future__ import division
+from past.utils import old_div
+(old_div(x, 2 * 3.0))
RefactoringTool: Files that need to be modified:
RefactoringTool: src/example.py
рдЬреИрд╕рд╛ рдХрд┐ 'рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо' рдЦрдВрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╣реА рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛: (old_div(x, 2) * 3.0)
рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди
x * (3.0 / 2)
рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬрдмрдХрд┐ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рд╕рдордХрдХреНрд╖, рдпрд╣ рдкрд╛рдпрдерди 2 рдкрд░ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ x
рдПрдХ int
, рддреЛ x / 2
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рдЫреЛрдЯрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ (3.0 / 2)
рд╣реЛрдЧрд╛ рд╣рдореЗрд╢рд╛ 1.5 рд░рд╣реЗрдВ рдФрд░ рдХрднреА рднреА рдЫреЛрдЯрд╛ рди рдХрд░реЗрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдмрдЧ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рднреА рдРрд╕рд╛ рд╣реА рд╕реЛрдЪрд╛ рдерд╛, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди 2.7.15 рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрд╛рдпрдерди 3.7.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХреА рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЗрд░рд╛рджрд╛ рдкреВрд░реА рддрд░рд╣ рдЧрд▓рдд рдирд╣реАрдВ рдерд╛ред
рд╢рд╛рдпрдж рдпрд╣ рдУрдПрд╕ рд╕реЗ рднреА рдЬреБрдбрд╝рд╛ рд╣реИ? рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ 7 x64 рдкрд░ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд╛рдпрдерди 2 рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдЧрд╛?
>>> y = range(10)
>>> [x / 2 * 3.0 for x in y]
[0.0, 0.0, 3.0, 3.0, 6.0, 6.0, 9.0, 9.0, 12.0, 12.0]
>>> [x * (3.0 / 2) for x in y]
[0.0, 1.5, 3.0, 4.5, 6.0, 7.5, 9.0, 10.5, 12.0, 13.5]
(рдЖрдкрдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рд╣реИред)
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореИрдВ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рддрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк 1.5 рдорд┐рд▓рд╛ред
рдореИрдВ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдлреНрдпреВрдЪрд░рд╛рдЗрдЬ рд╕рд╣реА рд░реВрдкрд╛рдВрддрд░рдг рджреЗрдЧрд╛ред
1 / 2 * 3.0
- -> old_div(1, 2) * 3.0
рдореБрдЭреЗ рдЙрд╕реА рдмрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдореИрдВ рдЕрдкрдиреА рд╢рд╛рдЦрд╛ рдкрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ:
$ cat sample.py
x = 10
(x / 2 * 3.0)
рдореВрд▓ рдЖрдЙрдЯрдкреБрдЯ
$ futurize sample.py
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored sample.py
--- sample.py (original)
+++ sample.py (refactored)
@@ -1,2 +1,4 @@
+from __future__ import division
+from past.utils import old_div
x = 10
-(x / 2 * 3.0)
+(old_div(x, 2 * 3.0))
RefactoringTool: Files that need to be modified:
RefactoringTool: sample.py
рдирдпрд╛ рдЖрдЙрдЯрдкреБрдЯ
$ futurize sample.py
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored sample.py
--- sample.py (original)
+++ sample.py (refactored)
@@ -1,2 +1,4 @@
+from __future__ import division
+from past.utils import old_div
x = 10
-(x / 2 * 3.0)
+(old_div(x, 2) * 3.0)
RefactoringTool: Files that need to be modified:
RefactoringTool: sample.py
рдЬрдм рдореИрдВ рд╕рдордп рджреЗрдЦреВрдВрдЧрд╛ рддреЛ рдореИрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ ..
рдпрд╣рд╛рдБ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
рдореИрдВ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдлреНрдпреВрдЪрд░рд╛рдЗрдЬ рд╕рд╣реА рд░реВрдкрд╛рдВрддрд░рдг рджреЗрдЧрд╛ред
1 / 2 * 3.0
- ->old_div(1, 2) * 3.0
рдЖрдкрдиреЗ рдЬреЛ рдХрд╣рд╛ рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ 1 / 2 * 3.0
рдХреЛ old_div(1, 2 * 3.0)
рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдорд╛рд╕реНрдЯрд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
$ cat sample2.py
1 / 2 * 3.0
x = 10
x / 2
x / 2.0
x / 2 * 3
x / (2 * 3)
x * 2 / 3
рдореВрд▓ рдЖрдЙрдЯрдкреБрдЯ
$ futurize sample2.py
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored sample2.py
--- sample2.py (original)
+++ sample2.py (refactored)
@@ -1,7 +1,9 @@
-1 / 2 * 3.0
+from __future__ import division
+from past.utils import old_div
+old_div(1, 2 * 3.0)
x = 10
-x / 2
+old_div(x, 2)
x / 2.0
-x / 2 * 3
-x / (2 * 3)
-x * 2 / 3
+old_div(x, 2 * 3)
+old_div(x, (2 * 3))
+old_div(x * 2, 3)
RefactoringTool: Files that need to be modified:
RefactoringTool: sample2.py
рдирдпрд╛ рдЖрдЙрдЯрдкреБрдЯ
$ futurize sample2.py
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored sample2.py
--- sample2.py (original)
+++ sample2.py (refactored)
@@ -1,7 +1,9 @@
-1 / 2 * 3.0
+from __future__ import division
+from past.utils import old_div
+old_div(1, 2) * 3.0
x = 10
-x / 2
+old_div(x, 2)
x / 2.0
-x / 2 * 3
-x / (2 * 3)
-x * 2 / 3
+old_div(x, 2) * 3
+old_div(x, (2 * 3))
+old_div(x * 2, 3)
RefactoringTool: Files that need to be modified:
RefactoringTool: sample2.py
PR created (https://github.com/PythonCharmers/python-future/pull/441)
рдореИрдВрдиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ old_div
рддрдм рднреА рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб рддреИрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ
1.0/1024.0
рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
old_div(1.0,1024.0)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд╛рдЬрди рдЬрд╣рд╛рдВ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб рддреИрд░рддреЗ рд╣реИрдВ, рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдкрд╛рдпрдерди 2 рдФрд░ рдкрд╛рдпрдерди 3 рдореЗрдВред
@mattgathu рдЖрдк рдлреНрдпреВрдЪрд░рд╛рдЗрдЬрд╝ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? Python 3.7.2 рдФрд░ рдлреНрдпреВрдЪрд░рд╛рдЗрдЬрд╝ 0.17.1 (PyPI рдореЗрдВ рдирд╡реАрдирддрдо) рдХреЗ рд╕рд╛рде, 1.0/1024.0
рдмрд░рдХрд░рд╛рд░ рд░рд╣рддрд╛ рд╣реИ рдЬрдм futurize
d.
$ python --version
Python 3.7.2
$ futurize --version
0.17.1
$ cat test.py
1.0 / 1024.0
1 / 1024.0
1.0 / 1024
$ futurize test.py
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: No files need to be modified.
рдпрд╣рд╛рдБ рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ:
$ python -V
Python 2.7.16
$ futurize --version
0.16.0
рдореИрдВрдиреЗ 0.17.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ v0.17.0 рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред
https://github.com/PythonCharmers/python-future/releases/tag/v0.17.0
рдЬрдЯрд┐рд▓ рднрд╛рд╡реЛрдВ рдХреЗ рдмреЗрд╣рддрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fix_division_safe рдХреЛ рдареАрдХ рдХрд░реЗрдВ, рдФрд░ рд╕реНрдкрд╖реНрдЯ рдлреНрд▓реЛрдЯ рдбрд┐рд╡реАрдЬрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред
рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИ, рдкрд╛рдпрдерди 2.7.16 рдкрд░ рдлреНрдпреВрдЪрд░рд╛рдЗрдЬрд╝ 0.17.1 рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
$ echo 'x = 100/10 * 10' | futurize --stage2 -
RefactoringTool: Refactored <stdin>
--- <stdin> (original)
+++ <stdin> (refactored)
@@ -1 +1,3 @@
-x = 100/10 * 10
+from __future__ import division
+from past.utils import old_div
+x = old_div(100,10 * 10)
RefactoringTool: Files that need to be modified:
RefactoringTool: <stdin>
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ 100/10 * 10
(==100) old_div(100,10 * 10)
(==1) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИ, рдкрд╛рдпрдерди 2.7.16 рдкрд░ рдлреНрдпреВрдЪрд░рд╛рдЗрдЬрд╝ 0.17.1 рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
100/10 * 10
(==100)old_div(100,10 * 10)
(==1) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред