【问题标题】:translating bash pre/post increment/decrement to python将 bash 前/后增量/减量转换为 python
【发布时间】:2015-02-14 00:19:00
【问题描述】:

我正在尝试改进Bash to Python translator

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

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

我找不到将上述内容转换为 python 表达式的方法,因为似乎 python 不允许在表达式中进行赋值等副作用。一个后备方案是编写一个 pre/post 函数,该函数将变量或字符串作为输入,并更改其外部项目以传递给函数。但我不知道如何让函数更改其输入参数变量。

如果我知道被操作的项目总是一个原子值,我可以通过将它的字符串名称映射到字典来改变它,以恢复这个值并修改它。但是++ 必须处理 bash 可能抛出的任何问题:例如++y[1]

有没有什么办法可以避免使用这种包含赋值的复杂 bash 表达式,并将它们分解为单独的 python 步骤,这些步骤在 bash 中逐语句构建整体计算。这会很丑陋。

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

【问题讨论】:

  • 如您所说,您将无法将其转换为 Python 表达式。要将其转换为 Python 代码,您需要将其分成多个 语句
  • 由于许多语言都允许这样的表达,这可能是 Python 设计者深思熟虑的设计决定。他们不希望你写那样神秘的代码。
  • stackoverflow.com/questions/1485841/… 有一个较晚的条目(从 2014 年 10 月 15 日开始),通过从调用者的本地符号表中选择变量来在 Python 中实现前置和后置增量有一个相当丑陋但有用的技巧。按名字。您是否想去那里取决于您,但您不太可能找到非常直接的映射。
  • @Wintermute:这个答案基本上是 OP 在最后一段第三段中提出的(“如果我知道......”),然后丢弃,因为它只适用于名称而不是“任何 bash 可能抛出在它:例如 ++y[1]".
  • 感谢 Wintermute。我希望你引用的迟到的条目可以解决问题。也感谢所有其他回复,但使翻译功能化的想法很有意义。这样您就可以通过简单地改进功能来改进翻译后的功能。

标签: python bash shell language-translation


【解决方案1】:

如果你真的想要这个功能,创建一个Box (MutableCell) 类型就很容易了,它支持像前置增量和后置增量这样的变异操作符。但这也会产生很多开销,特别是因为您必须将((i=j)) 转换为i = Box(j.unbox())(或者如果您知道i 已经存在,则为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[i.postincrement()] = ( Box(z.preincrement(-1)
                       + t.preincrement(2) * u.unbox())

或者,如果您之前已将 x 创建为 defaultdict(Box),则可以使用 x[i.postincrement()].reset( ... )

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

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 2015-05-21
    • 2013-04-25
    • 2011-09-18
    • 2012-09-15
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多