我为Python 3.1维护了一个项目的分支.当我最初从2.6创建端口时,我使用了2to3,但现在我不得不将2.6 fork中的新代码合并到3.1 fork中.如何自动对这些合并执行2to3操作?(如果重要,我会使用git.)
我有一个非常大的Python 2.7.6项目,我需要将其转换为Python 3.4.我使用了2to3脚本,但'metaclass'处理似乎被打破了.
我过滤了代码以缩短并查明问题.以下片段适用于Python 2.7.6:
class Base(object):
class __metaclass__(type):
def __new__(cls, classname, bases, dict):
new = type.__new__(cls, classname, bases, dict)
new.classname = classname
print ("Base::__metaclass__::new. Called.")
return new
class Heir(Base):
class __metaclass__(Base.__metaclass__):
def __new__(self, *args):
new = Base.__metaclass__.__new__(self, *args)
print ("Heir::__metaclass__::new. Called.")
return new
@classmethod
def define(cls, nexttype):
print ("Heir::define. Called.")
class HeirOfHeir(Heir):
pass
Heir.define(HeirOfHeir)
Run Code Online (Sandbox Code Playgroud)
代码按预期打印:
Base::__metaclass__::new. Called.
Base::__metaclass__::new. Called.
Heir::__metaclass__::new. Called.
Base::__metaclass__::new. Called.
Heir::__metaclass__::new. Called.
Heir::define. Called.
Run Code Online (Sandbox Code Playgroud)
但是当使用Python 3.4运行代码时,我只有最后一个打印:
Heir::define. Called.
Run Code Online (Sandbox Code Playgroud)
要么2to3计算错误,要么需要进行一些手工操作.不幸的是,我对元类很少有经验.
将项目迁移到Python 3(2to3-3.7 -w -f print *)时,我观察到很多(但不是全部)print语句变成了print((...)),因此这些语句现在打印出元组而不是执行预期的行为。我收集到,如果我使用过的话,那么我-p现在会处于一个更好的位置,因为from __future__ import print_function它位于每个受影响的模块的顶部。
我正在考虑尝试使用sed修复此问题,但是在此之前,我想知道是否还有其他人对此进行过处理。是否有2to3功能可以清除此问题?
我确实使用版本控制(git),并且前后都有提交(以及2to3创建的.bak文件),但是我不确定如何将自己所做的更改与打印情况区分开。
我正在尝试转换用python 2编写的selenium.py.
如下所示,我将selenium.py复制到C:\ Python32\Tools\Scripts>并执行后
2to3.py selenium.py
Run Code Online (Sandbox Code Playgroud)
我看到文件是一样的.我做错了什么?或者从哪里下载这个文件转换?
C:\Python32\Tools\Scripts>2to3.py selenium.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored selenium.py
--- selenium.py (original)
+++ selenium.py (refactored)
@@ -18,8 +18,8 @@
# This file has been automatically generated via XSL
-import httplib
-import urllib
+import http.client
+import urllib.request, urllib.parse, urllib.error
import re
class selenium:
@@ -186,34 +186,34 @@
self.extensionJs = extensionJs
def start(self):
- print (self.browserURL)
+ print((self.browserURL))
result …Run Code Online (Sandbox Code Playgroud) 我的Ubuntu 12.04股票python安装有2个程序,用于将代码转换为Python 3.x:2to3-2.7和2to3-3.1.有什么不同?
从Python 2to3 doc:
input:转换
input(prompt)为eval(input(prompt))
我正在尝试使用Python 2几年后学习Python 3.任何人都可以解释为什么工具eval在调用之前插入input,以及我是否应该在所有Python 3代码中执行此操作?
我正在尝试使用pip install -r requirements.txt.来维护依赖项.但是,某些必需的包不直接支持Python 3,但可以使用手动转换2to3.
在做什么时有办法强制自动pip运行2to3这些包pip install -r requirements.txt吗?
我写了自己的修复程序,我该如何运行它?我没有找到明显的方法来做到这一点。
只有这个:
> cd /usr/lib/python2.7/lib2to3/fixes/
> ln -s path/to/my_fixer.py
Run Code Online (Sandbox Code Playgroud)
然后运行它:
> cd path/to/project
> 2to3 -f my_fixer .
Run Code Online (Sandbox Code Playgroud) 我可以2to3在终端中加载文件。它进行了大量打印,输出如下:
- print str
+ print(str) ...
Run Code Online (Sandbox Code Playgroud)
但是文件保留不变。而且我在“运行2to3” 之后没有任何说明。请帮忙。
我可以翻译一个文件。但是我不明白如何翻译整个目录。从文档:
To translate an entire project from one directory tree to another use:
$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode
Run Code Online (Sandbox Code Playgroud)
能给我一个具体的例子吗?我有python2文件D:\Dir1,想在中获取新文件D:\Dir2。我现在在命令提示符下Dir1键入c:\Users\........\Python36\Tools\scripts\2to3.py -w
那么我应该使用什么命令?
我正在尝试编写一个可以运行python 2和3的程序.它从网站读取字符并写入文件.我已经unicode_literals从__future__ 导入了.
直接尝试写一个看起来像这样的字符串:
txt = u'his$\u2026\n'
Run Code Online (Sandbox Code Playgroud)
会导致UnicodeEncodeError:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 4: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
将它写入python2中的文件的唯一方法是:
fp = open("/tmp/test", "w")
txt2 = txt.encode('utf-8')
fp.write(txt2) # It works
type(txt2) # str - that is why it works
Run Code Online (Sandbox Code Playgroud)
但是,尝试在python3中重用相同的代码是不行的,因为在python 3中,
type(txt2) # is byte type
Run Code Online (Sandbox Code Playgroud)
例如
txt.encode('utf-8')
b'his$\xe2\x80\xa6\n'
Run Code Online (Sandbox Code Playgroud)
强制a fp.write(txt2)会抛出TypeError:
TypeError: write() argument must be str, not bytes
Run Code Online (Sandbox Code Playgroud)
因此,可以txt = u'his$\u2026\n'在python 2和3中使用相同的代码块写入文件中.(除了在fp.write上使用包装器)
我得到一个预期浮点数的整数错误,所以我改变它然后反过来说浮点数不能是一个整数.之前我遇到过类似的问题,只是把它改成了int.
我正在通过python27中的教程学习,但大多数情况下通过故障排除让它们在python34中工作.这个我被困住了.
TypeError:整数参数expect go float'
for tile in return_tiles:
pygame.draw.circle(screen, [34, 95, 200],
[tile.x + half - 2, tile.y + half - 2], 5 )
Run Code Online (Sandbox Code Playgroud)
所以我接着在下面进行了更改,它通常会像下一个那样工作,但在这种情况下会出错
TypeError:'float'对象不能解释为整数
for tile in return_tiles:
pygame.draw.circle(screen, (34, 95, 200), (int(tile.x + half -2),int(half - 2, tile.y + half - 2)), int(5))
Run Code Online (Sandbox Code Playgroud)
我如何修复下面的另一个例子是一个整数,但在上面的情况下它不起作用
pygame.draw.circle(screen, (34, 95, 200), (int(tile.x + half -2),int(half - 2, tile.y + half - 2)), int(5))
Run Code Online (Sandbox Code Playgroud)
我一直通过在线学习教程来教自己,但大多数是python的早期版本2.7等.但这在很大程度上并不是一个问题.我一直在使用错误消息,大多数情况下我可以弄清楚,如果有时我没有运行2to3.py或搜索找到答案.
我用来2to3转换 python 模块的文件夹。一切都很顺利,但是当我去运行其中一些时,它给了我一个关于空格和制表符的错误。我的理论:当2to3更改一行时,它使用制表符而不是空格,这与其他未更改的行不同。我想知道是否有办法改变这一点。
错误是:
TabError: inconsistent use of tabs and spaces in indentation
Run Code Online (Sandbox Code Playgroud)
代码片段很难显示,因为显示的制表符相当于 4 个空格,但我检查了一下,发现这种情况正在发生。
python-2to3 ×13
python ×12
python-3.x ×5
merge ×1
metaclass ×1
pip ×1
pygame ×1
python-2.7 ×1
sed ×1
selenium ×1
ubuntu-12.04 ×1