将bash前/后递增/递减转换为python

时间:2015-02-14 00:19:00

标签: python bash shell language-translation

我正在尝试改进Bash to Python translator

Bash允许++--,而Python则不允许。很多人建议++x可以改写为x += 1。但是这忽略了一个要求,即能够在递增/递减之前或之后恢复结果值x作为潜在复杂bash表达式的一部分,例如:

x=$(( ++y + z--)).

我找不到将上面的内容转换为python表达式的方法,因为看起来python不允许在表达式中赋值等副作用。后退将是编写一个前/后函数,该函数将变量或字符串作为输入,并更改其外部项以便传递给函数。但我无法弄清楚如何改变输入参数变量的函数。

如果我知道正在操作的项目始终是原子值,我可以通过将其字符串名称映射到字典来修改它来修改它,然后修改它。但++必须处理bash可能抛出的任何内容:例如++y[1]

有没有办法避免必须采用包含赋值的复杂bash表达式,并将它们分解为单独的python步骤,这些步骤构建了在bash语句中执行的整体计算。这将是非常难看的。

我只需要在python中以某种方式通过引用实现调用。

1 个答案:

答案 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)

但很难相信这是值得的开销。