嵌套参数未编译

2024-10-04 09:19:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将我的代码编译成python3模块。当我在IDLE中选择“Run module”时,它运行得很好,但是当我尝试创建分发时收到以下语法错误:

File "/usr/local/lib/python3.2/dist-packages/simpletriple.py", line 9
    def add(self, (sub, pred, obj)):
                  ^
SyntaxError: invalid syntax

有谁能帮忙指出语法有什么问题吗?以下是完整代码:

^{pr2}$

Tags: 模块run代码libpackagesusrlocaldist
1条回答
网友
1楼 · 发布于 2024-10-04 09:19:31

PEP 3113解释了为什么在python3中删除了这个特性“tuple parameter unpacking”。它还解释了如何移植使用它们的代码。在这种情况下,您需要更改如下函数:

def add(self, (sub, pred, obj)):
    self._addToIndex(self._spo, sub, pred, obj)
    self._addToIndex(self._pos, pred, obj, sub)
    self._addToIndex(self._osp, obj, sub, pred)

对于将元组作为单个参数传递并手动解压缩的版本:

^{pr2}$

对于lambda函数,不能使用赋值来解包。最好的解决方案通常是不拆包。例如,更改此选项:

lambda (x, y): (y, x)

……对此:

lambda xy: (xy[1], xy[0])

对于复杂的函数,这可能会变得很难看,但是对于复杂的函数,您可能还是想def它们。在


值得注意的是,通过^{}^{}^{}运行代码,会在def和{}中发现此问题,并提出以下解决方案:

$ echo 'lambda (x,y): (y,x)' | 2to3 -
 - <stdin> (original)
+++ <stdin> (refactored)
@@ -1 +1 @@
-lambda (x,y): (y,x)
+lambda x_y: (x_y[1],x_y[0])

$ echo -e 'def foo((x,y)):\n    return (y,x)\n' | 2to3 -
 - <stdin> (original)
+++ <stdin> (refactored)
@@ -1 +1 @@
-def foo((x,y)):
+def foo(xxx_todo_changeme):
+    (x,y) = xxx_todo_changeme

如果您试图将python2.x代码移植到3.x(或双版本代码),并且不知道这两种语言,那么您几乎肯定希望使用这些工具中的一种或一个包装它们的IDE插件来提供帮助。(尽管您可能不希望按原样使用其输出。)

相关问题 更多 >