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

标签 python bash shell language-translation

我正在尝试改进 Bash to Python translator .

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

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

我找不到将上面的内容转换为Python表达式的方法,因为Python似乎不允许诸如在表达式中赋值之类的副作用。一种后退方法是编写一个前/后函数,该函数将变量或字符串作为输入,并更改其外部项目,以便传递给函数。但我不知道如何让函数改变其输入参数变量。

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

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

我只需要在 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/

相关文章:

python google app engine strip 集成

linux - 在文本文件中添加存储在第二个 'column' 中的数千个数字?

shell - rm -rf/base-dir-path/*/work 与/base-dir-path/*/*/work 不同

bash - 如何检查 bash 脚本中文件名的扩展名?

ruby-on-rails - 如何编写 bash 脚本以在 Rails 控制台中运行命令

python - 返回函数代码

python - 如何在 Python 中获取嵌套函数的命名空间?

python - (python) 我是否在 tar.gz 文件上使用 os.path.join

bash - VS Code - wsl 服务器意外关闭

bash - 语法错误 : unexpected end of file when editing code within here documents with emacs. 使用 nano 工作正常