我正在尝试改进 Bash to Python translator .
Bash 允许 ++
和 --
,而 Python 则不允许。很多人建议++x
可以重写为x += 1
。但这忽略了这样的要求:作为潜在复杂的 bash 表达式的一部分,在递增/递减之前或之后能够恢复 x 的结果值,例如:
x=$(( ++y + z--)).
我找不到将上面的内容转换为Python表达式的方法,因为Python似乎不允许诸如在表达式中赋值之类的副作用。一种后退方法是编写一个前/后函数,该函数将变量或字符串作为输入,并更改其外部项目,以便传递给函数。但我不知道如何让函数改变其输入参数变量。
如果我知道正在操作的项目始终是原子值,我也许可以通过将其字符串名称映射到字典来更改它,以恢复该值并修改它。但是 ++
必须能够处理 bash 可能抛出的任何内容:例如 ++y[1]
。
我只需要在 python 中以某种方式实现引用调用。
最佳答案
如果您确实想要该功能,那么创建一个支持前增量和后增量等变异运算符的 Box
(MutableCell) 类型就很容易了。但这也会带来很大的开销,特别是因为您必须将 ((i=j))
转换为 i = Box(j.unbox())
(或 i.reset(j.unbox())
如果您知道 i
已经存在。
粗略地说,它看起来像这样,除了对字符串与数字进行更多检查,以及在这种情况下适当的逻辑。
class Box(object):
__slots__ = ["value"]
def __init__(self, value=None):
self.value = value
def unbox(self):
return self.value
def reset(self, value=None):
self.value = value
return value
def preincrement(self,inc=1):
self.value += inc
return self.value
def postincrement(self,inc=1):
tmp = self.value
self.value += inc
return tmp
然后您可以将 x[i++] = --z + (t += 2) * u
(Yuk!) 翻译成:
x[i.postincrement()] = ( Box(z.preincrement(-1)
+ t.preincrement(2) * u.unbox())
或者,如果您之前已将 x
创建为 defaultdict(Box),则可以使用
。x[i.postincrement()].reset( ... )
)
但真的很难相信这些开销是值得的。
关于python - 将 bash 前/后递增/递减转换为 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28510936/