我正在尝试改进Bash to Python translator。
Bash允许++
和--
,而Python则不允许。很多人建议++x
可以改写为x += 1
。但是这忽略了一个要求,即能够在递增/递减之前或之后恢复结果值x
作为潜在复杂bash表达式的一部分,例如:
x=$(( ++y + z--)).
我找不到将上面的内容转换为python表达式的方法,因为看起来python不允许在表达式中赋值等副作用。后退将是编写一个前/后函数,该函数将变量或字符串作为输入,并更改其外部项以便传递给函数。但我无法弄清楚如何改变输入参数变量的函数。
如果我知道正在操作的项目始终是原子值,我可以通过将其字符串名称映射到字典来修改它来修改它,然后修改它。但++
必须处理bash可能抛出的任何内容:例如++y[1]
。
有没有办法避免必须采用包含赋值的复杂bash表达式,并将它们分解为单独的python步骤,这些步骤构建了在bash语句中执行的整体计算。这将是非常难看的。
我只需要在python中以某种方式通过引用实现调用。
答案 0 :(得分:1)
如果你真的想要这个功能,那么创建一个Box
(MutableCell)类型就足够了,它支持像preincrement和postincrement这样的变异运算符。但这也会带来很多开销,特别是因为你必须将((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[i.postincrement()].reset( ... )
创建为x
,则可以使用defaultdict(Box)
。
但很难相信这是值得的开销。