28

我想知道print函数是否可以像Python 2和早期版本那样工作(而不需要到处更改语法)。

所以我有这样的说法:

打印“你好,世界!”

我喜欢在Python 3中使用这种语法。我已尝试导入库,但这并没有起到作用(仍然是一个语法错误)。

1
  • 4
    哈哈,我也想要同样的东西。除了print语句之外,我喜欢python 3的所有功能
    – 枪械
    评论 2017年4月7日15:37

5个答案5

重置为默认值
21

不,你不能。这个打印语句在Python 3中消失了;编译器不再支持它了。

可以制作打印()像函数一样工作在Python 2中; 将此放在使用的每个模块的顶部打印:

来自__future__import print_function

这将移除对打印语句,就像在Python 3中一样,您可以使用打印()Python 2附带的函数.

只能帮助在编写代码时同时考虑Python 2和3;包括更换打印语句打印()功能第一.

你可能想读一下将Python 2代码移植到Python3如何操作; 它会告诉你更多这样的事情来自__future__导入,以及引入诸如现代化Futurize(未来化)这有助于自动修复Python 2代码,使其同时适用于Python2和Python3。

5
  • 5
    真遗憾,我需要执行第三方提供的代码,我真的不喜欢检查所有代码,更改所有打印:/。(你在这里描述的与我的问题相反:我确实在python 3中工作,但我需要运行由python 2工作人员编写的代码)
    – 保罗23
    评论 2015年3月6日10:25
  • 1
    @保罗23:对不起,工具错了。您应该尝试使用2至3效用自动修复Python 2代码。 评论 2015年3月6日上午10:32
  • 1
    @如果你是保尔23真正地对python的语句和关键字机制感兴趣,您可能会喜欢阅读文章。 评论 2015年3月6日13:48
  • 我的情况更糟。。。我有一些预处理的数据,其中包含带有打印语句的对象。。。代码转换器无法转换我认为对象的成员函数。
    – 伊明
    评论 2018年5月3日3:41
  • @ymeng:代码翻译可以很好地处理成员函数。 评论 2018年5月3日6:44
9

你可以使用这个工具2至3是一个自动Python 2到3代码转换,@Martijn Pieters告诉:),您可以跳过一段路程,将旧的python扔到python 3中,使更改生效,我做了这样一个简单的示例:

我创建了这个文件python2.py:

#!蟒蛇3打印5

当我用python运行它时,它显然显示:

第3行打印5^语法错误:调用“print”时缺少括号

因此,您可以这样通过终端进行转换:

这是重要的命令

$2to3-w主页/path_to_file/python2.py

-w参数将写入文件,如果您只想看到未来的更改而不应用它们,只需在不使用-w的情况下运行它即可。运行后,它将显示如下内容

root:从/usr/lib/python2.7/lib2to3/PatternGrammar.txt生成语法表重构工具:重构桌面/stackoverflow/goto.py---桌面/stackoverflow/goto.py(原版)+++桌面/stackoverflow/goto.py(重构)@@ -1,3 +1,3 @@#!蟒蛇3-打印5+打印(5)RefactoringTool:已修改的文件:

文件将看起来像:

#!蟒蛇3打印(5)
1
  • 2to3不好用-它转换不好:打印('x'+'a')
    – 内森·G
    评论 2022年12月5日8:42
9

可以使用正则表达式替换打印Python 2与Python3的代码:

查找:(打印)(.*)(\n)替换为:$1($2)$3
1
  • 正则表达式在什么上下文中?A类波尔脚本?这将使用各种风格的正则表达式。你能提供一个例子吗(通过编辑您的答案,不在评论中(没有“编辑:”、“更新:”或类似内容)? 评论 2020年12月4日7:52
2

如果你同意重写内置组件__导入__和一个简单的正则表达式来转换没有paren的print语句,然后您可以执行以下操作。请注意,这实际上并没有更改任何文件,只是当您导入它们时,它会将代码读入字符串,调整该字符串,然后将修复的代码发送给编译器/导入器

进口再进口导入系统如果sys.version_info>=(3,0):导入lib2to3从lib2to3导入main,重构导入操作系统导入类型导入内置程序导入系统导入importlib缓存={}prevImport=内置__导入__def customImport(路径、*args、**kwargs):#打印(路径、参数、夸格斯)尝试:return导入(路径+“.py”)除:return prevImport(路径,*args,**kwargs)def重新加载(文件名):fimport(文件名.__file__,forceReload=True)def-fimport(文件名,forceReload=False):文件名=os.path.abspath(文件名)modulePath=os.path.splitext(os.path.basename(文件名))[0]如果文件名在缓存中而不是forceReload:execval,modifyTime,module=缓存[文件名]如果modifyTime==os.path.getmtime(文件名):返回模块f=打开(文件名)text=f.read()+“\n”p=重新编译(“打印”)res=[]curI=0对于p.finditer中的m(文本):i=m.start()res.append(文本[curI:i])curI=ipieceTmp=text[i:].split(“\n”)[0]piece=文本[i:].split(“\n”)[0].splot(“#”)[0]pieceAfter=件[len('打印'):].strip()if pieceAfter[0]!='(':resLine=“print”+“(”+pieceAfter+“)”+“\n”res.附件(resLine)其他:res.append(件Tmp)curI+=长度(个Tmp)+1text=“”.join(res)f.关闭()'''#如果需要,此代码可以运行lib2to3,但仅用于替换不需要的打印#fixes=已排序(lib2to3.refactor.get_fixers_from_package('lib2to5.fixes'))fixes=['lib2to3.fixes.fix_print']rt=lib2to3.main。StdoutFactoringTool(修复,{},[],False,False)res=str(rt.refactor_string(文本,名称=模块路径))'''res=文本res=编译(res,'<string>','exec')模块=类型。ModuleType(模块路径)模块__file__=文件名cache[文件名]=(res,os.path.getmtime(文件名),模块)exec(res,模块.__dict__)返回模块内置组件__import__=自定义导入importlib.reload=重新加载

如果您将此代码保存到,比如说,patimport.py,那么假设我有一个名为juniper.py的文件:

定义哇(a):打印

现在,如果我想从python3调用juniper.py,我可以这样做

导入patiimport进口杜松子杜松子哇(“豆子”)

它将运行:)

这可能会更快,更像典型的带有缓存和日志记录等功能的导入,但我还不清楚pyc文件是如何生成的以及何时生成的。c插件也可能存在一些边缘情况,我不确定。因此,请随意提出改进建议,但至少这是一个概念证明。我认为您应该能够实际调整解释器输入和当前文件的值,但我现在正在处理这个问题。

从技术上讲,这还允许您导入任何python2文件(2to3修复xrange、print等),如果这些文件导入其他python2中文件,它们也会被转换,因为这会覆盖所有人使用的导入。您还可以实现任意操作符重载,需要静态类型,实际上需要大括号,从技术上甚至可以从其他语言导入代码,或者使用这个导入来更改python。但我离题了

6
  • 1
    这将尝试在所有代码上运行2to3,不管它实际上是不是Python 2代码。 评论 2017年11月7日6:13
  • 2to3可以很好地与python3代码一起工作(它只是不做任何更改),但是的,我同意需要考虑很多边缘情况(例如.pyd)。这很容易做到,因为您只需调用原始的导入函数,但我只是没有在这里添加检查。理想情况下,它还应该生成.pyc文件。请随意提出修改建议。
    – 叶状纲
    评论 2017年11月7日6:14
  • 尝试在上运行2到3打印(1,2),您将看到在Python 3代码上运行2to3是不安全的。 评论 2017年11月7日6:18
  • 我明白了(1, 2)(在具有打印)python3到底是做什么的?还有类似的东西打印(1,2)\n打印('games',end='')也很好
    – 叶状纲
    评论 2017年11月7日6:20
  • 嗯,我也不介意(我一定是做错了什么,以为它真的管用了)。所以你是对的,我相信一些案例分析可以解决这个问题,但肯定会更糟糕
    – 叶状纲
    评论 2017年11月7日6:26
0

以下代码段适用于交互式使用。当出现打印语法错误时,脚本将再次执行失败的命令,并用python3的“()”括起来。

#!/usr/bin/python3.8-i导入子进程,shlex,sys,readline,tracebackdef excepthook(exctype,value,tb):如果exctype为SyntaxError:索引=readline.get_current_history_length()命令=readline.get_history_item(索引)if命令.find(“打印”)!=-1:sp=command.split(“打印”)[1]new=“打印”+“(”+sp+“)”eval(新)其他:traceback.print_exception(exctype,value,tb)sys.excepthook=例外挂钩

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问自己的问题.