Python 字典是 Rexx 复合变量的等效数据结构吗?

Would a Python dictionary be the equivalent data structure to a Rexx compound variable?

我正在努力将一个冗长的 Rexx 脚本重写成一个 Python 程序,并且我正在尝试找出模拟 Rexx 复合变量功能的最佳方法。字典是最好的选择吗?显然,字典的行为会有所不同,不会与复合变量完全相同。

我不是 Python 人,但我知道字典是什么。

取决于 Rexx 复合变量的复杂程度,是的。

a.b

...很容易翻译成字典。

a.b.c.d.e.f.g.h

...不太容易翻译成字典。也许字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典中的字典。

Rexx-Stem变量和python-dictionaries类似但也有区别。 考虑基于字典 RexxStem class

简单的 Stem 表达式

a.b

可以翻译成python如

a[b]

复合词干表达式

根据我的经验

a.b.c.d

将被翻译成 python 为

a[b + '.' + c + '.' + d]

尝试 运行 使用您当前的解释器使用以下 rexx,看看您能得到什么 得到:

  a.2.3 = 'qwerty'

  zz = 2'.'3
  say a.zz

在一些 rexx 解释器中你会得到 'qwerty'。不确定是否就这些

初始化一个词干变量

在 rexx 中你可以初始化一个词干变量 lic

a. = 'abc'

一些常见的用途是

no = 0
yes = 1

found. = no

if ... then do
   found.v = yes
end

....

if found.y = yes then do
   ..
end

counts. = 0

do while ...
   if ... then do
       counts.v = counts.v + 1;
   end
end

词干变量的初始值

像所有 Rexx 变量一样,变量的 default/initial 值因此 a.2.3 的默认值是 A.2.3.如果您来自另一种语言,这可能看起来很奇怪,但它在调试时非常方便 - 如果变量名意外弹出 --> 您还没有启动。这也意味着如果您不初始化变量,数值表达式会崩溃。

这不是您需要实施的东西,请注意。

Python 字典和 Rexx 词干都是 associative arrays。他们的行为方式略有不同。 Rexx的规则很简单:

  1. 数组引用分为 "stem" 和 "tail",由一个点分隔。
  2. 词干是一个变量名,case-independently。这是字典。
  3. 处理尾部以标识数组的元素。它被拆分为一个或多个 dot-separated 个子字符串。每个子字符串都被视为一个变量:如果有一个具有该 case-independent 名称的变量,则使用它的值而不是它的名称。否则名称将被大写并使用。字符串被放回原处,点和所有。这是关键。
  4. 数组可以有一个默认值,由 stem. = value 设置,适用于所有未设置的元素。

因此,Python 中数组引用 stem.tailpart1.tailpart2.tailpart3 的结果是:

def evaluate_tail(tail, outer_locals):
   result = []
   for element in tail.split('.'):
      if element in outer_locals:
         result.append(str(outer_locals[element]))
      else:
         result.append(str(element).upper())
   return '.'.join(result)

array_default_value = 4
stem = {'A.B.C': 1, 'A.9.C': 2, 'A..q': 3}
b = 9
d = 'q'

tail1 = 'a.b.c'
tail2 = 'a..b'
tail3 = 'a..d'

stem.get(evaluate_tail(tail1,locals()), array_default_value) # 'stem.a.b.c' >>> stem['A.9.C'] >>> 2
stem.get(evaluate_tail(tail2,locals()), array_default_value) # 'stem.a..b' >>> stem['A..9'] (not found) >>> (default value) >>> 4
stem.get(evaluate_tail(tail3,locals()), array_default_value) # 'stem.a..d' >>> stem['A..q'] >>> 3