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

将bash前/后增量/减量转换为python,python,bash,shell,language-translation,Python,Bash,Shell,Language Translation,我正在努力改进一个新的方法 Bash允许++和--,而Python不允许。许多人建议将++x重写为x+=1。但这忽略了一个要求,即作为潜在复杂bash表达式的一部分,可以在递增/递减之前或之后恢复x的结果值,例如: x=$(( ++y + z--)). 我找不到将上述内容转换为python表达式的方法,因为python似乎不允许表达式中的赋值等副作用。回退方法是编写一个pre/post函数,将变量或字符串作为输入,并修改其外部项,以便传递给函数。但是我不知道如何让一个函数改变它的输入参数变量

我正在努力改进一个新的方法

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

x=$(( ++y + z--)).
我找不到将上述内容转换为python表达式的方法,因为python似乎不允许表达式中的赋值等副作用。回退方法是编写一个pre/post函数,将变量或字符串作为输入,并修改其外部项,以便传递给函数。但是我不知道如何让一个函数改变它的输入参数变量

如果我知道正在操作的项始终是一个原子值,那么我可能可以通过将其字符串名称映射到字典来更改它,以恢复该值并对其进行修改。但是
++
必须处理bash可能抛出的任何东西:例如
++y[1]

是否有任何方法可以避免采用包含赋值的复杂bash表达式,并将它们分解为单独的python步骤,以构建bash中执行的整体计算,逐语句执行。这会很难看


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

如果您真的需要该功能,那么创建一个支持诸如preincrement和postinrement之类的变异运算符的
Box
(MutableCell)类型就足够容易了。但是这也会带来很大的开销,特别是因为如果您知道
i
已经存在,那么必须将
((i=j))
转换为
i=Box(j.unbox())
(或者
i.reset(j.unbox())

粗略地说,它看起来是这样的,除了对字符串和数字进行更多的检查,以及在这种情况下的适当逻辑

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
创建为
defaultdict(Box)
,则可以使用
x[i.postincrement()].reset(…)


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

正如您所说,您将无法将其转换为Python表达式。要将其转换为Python代码,您需要将其拆分为多个语句。由于许多语言都允许这样的表达式,这可能是Python设计师深思熟虑的设计决定。他们我不想让你写这样的晦涩代码。有一个迟到的条目(从10月15日到14日)这有一个相当丑陋但实用的技巧,通过从调用者的本地符号表中按名称选取变量来实现Python中的前置和后置增量。是否要去那取决于你自己,但你不可能找到一个非常直接的映射。@Wintermute:这基本上就是OP在最后第三段中提出的答案(“如果我知道…”),然后丢弃,因为它只适用于名称,而不适用于“bash可能抛出的任何东西:例如++y[1]“。谢谢Wintermute。我希望你引用的最新条目能起到作用。也感谢所有其他回复,但是让翻译功能化的想法很有意义。这样,你可以通过简单地改进功能来改进翻译后的功能。
x[i.postincrement()] = ( Box(z.preincrement(-1)
                       + t.preincrement(2) * u.unbox())