Python字典是否与Rexx复合变量的数据结构等效?
我正在将一个冗长的Rexx脚本重写到Python程序中,并试图找出模拟Rexx复合变量功能的最佳方法。字典是最好的选择吗?显然,字典的行为会有所不同,并且不会与复合变量完全相同。我不是Python人,但我知道字典是什么 根据Rexx复合变量的复杂程度,是Python字典是否与Rexx复合变量的数据结构等效?,python,rexx,oorexx,Python,Rexx,Oorexx,我正在将一个冗长的Rexx脚本重写到Python程序中,并试图找出模拟Rexx复合变量功能的最佳方法。字典是最好的选择吗?显然,字典的行为会有所不同,并且不会与复合变量完全相同。我不是Python人,但我知道字典是什么 根据Rexx复合变量的复杂程度,是 a.b …很容易翻译成字典 a.b.c.d.e.f.g.h …不太容易翻译成字典。可能是词典中的词典在词典中的词典在词典中的词典在词典中的词典在词典中的词典在词典中的词典 Rexx-Stem-variable和python字典类似,但有区别。
a.b
…很容易翻译成字典
a.b.c.d.e.f.g.h
…不太容易翻译成字典。可能是词典中的词典在词典中的词典在词典中的词典在词典中的词典在词典中的词典在词典中的词典 Rexx-Stem-variable和python字典类似,但有区别。
考虑基于字典创建一个RexxStem类
简单词干表达式
可以翻译成python作为
a[b]
a[b + '.' + c + '.' + d]
复合词干表达式
根据我的经验
a.b.c.d
将被翻译成python作为
a[b]
a[b + '.' + c + '.' + d]
试着用当前的解释器运行以下rexx,看看你能做些什么
获取:
在一些rexx解释器中,您会得到“qwerty”。我不确定是否就这些
初始化Stem变量
在rexx中,可以初始化stem变量lic
a. = 'abc'
一些常用的用法是
no = 0
yes = 1
found. = no
if ... then do
found.v = yes
end
....
if found.y = yes then do
..
end
或
stem变量的初始值
与所有Rexx变量一样,变量的默认值/初始值,因此a.2.3的默认值为a.2.3。如果您来自另一种语言,这可能看起来很奇怪,但在调试时非常方便-如果变量名意外弹出-->您尚未启动。这也意味着如果不初始化变量,数值表达式会崩溃
这不是您需要实现的东西,只是要注意。Python字典和Rexx词干都是。他们的行为方式有点不同。Rexx的规则非常简单:
stem.=值,该值适用于所有未设置的元素
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
我认为这两种情况都可以通过字典a.b==>a[b]和a.b.c==>a[b+'.'c]在pythonth中处理。这很有意义,我现在看到了这两种结构之间的差异,我一定会考虑创建一个类来模拟它!是的,
a.b.c.d
将被翻译成Python作为a[b+.+c+.+d]
,但需要注意的是,如果未设置b
、c
或d
,它们的值将分别为“b”、“c”和“d”。这对于任何Rexx变量都是正确的。”a.2.3='qwerty';zz=2''3;说a.zz
在一些Rexx解释器中,你会得到'qwerty'。不确定这是否就是全部”-是的,这是正确的Rexx行为。任何Rexx实现都应该产生这样的结果<代码>2.“'3表示“连接2、.”和3,并将结果分配给zz”,“a.2.3”表示“命名为“2.3”的元素”,“a.zz”表示“值为zz的命名元素”。“a.2.3的默认值为a.2.3”“-更准确地说,任何简单变量的默认值都是大写的名称,任何复合变量的尾部都是其所有元素作为简单变量的串联,点保持不变,而未设置的复合变量的值是词干的默认值,或者在没有默认设置的情况下,用大写字母连接茎和尾,并保持点的完整性。
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