尝试将旧的pascal脚本转换为python:pascal“记录”问题

时间:2018-11-08 16:17:55

标签: python python-3.x pascal

我目前的任务是将旧的pascal脚本翻译成python。问题是,我对pascal没有任何经验……直到现在,一切都进行得很好(大多数脚本是不言自明的),但是现在我遇到了一小段代码,我只是无法弄清楚退出:

# some other code here...

type MeasurementPoint = record
                         lambda : double;
                         value : double;
                        end;

# some more code...

procedure foo(MyFileName: string, somemoreargs):
var  somevars: integer; 
     somemorevars: double;
     temp: MeasurementPoint; 

# even more code...

  i:= 0;
  Assign(MyInFile,MyFileName);
  Reset(MyInFile);
  repeat
    Inc(i);
    SetLength(Reflexion, i);
    readln(MyInFile, temp.lambda, temp.value);
    Reflexion[i-1]:=temp;
  until EoF(MyInFile);
  Close(MyInFile);

我只是无法理解这部分代码应该做什么... 我非常了解,正在逐行读取完整文件MyInFile,并且每一行包含两个值,即'lambda''value',它们被提取为双精度。

根据pascal Wiki,record是一个容器,能够容纳不同类型的对象并将它们逻辑地分组在一起(这可以与python中的字典进行比较吗?)。如果我正确理解SetLength,则可以使用它来定义数组的长度,这在这里很有意义。每次读取一行时,i都会增加,因此temp的长度也会增加,以适应已经从文件中提取的lambdavalue对的数量(请正确如果我的假设是错误的,那就是我!)。但是我不明白其余代码应该做什么,尤其是Reflexion[i-1]:=tempReflexion是类型为MeasurementPoint且长度为i-1的对象吗?或那部分是什么意思?为什么将lambdavalue提取为temp.lambdatemp.value?会自动将它们配对成一条记录吗??

如果有人可以通过解释帮助我,我将不胜感激。而且,当然,如果您碰巧知道如何将其转换为python 3.x,那就更好了;-)

1 个答案:

答案 0 :(得分:1)

Pascal的record就像Python的namedtuple一样。在temp.lambda函数中逐字段(因此temp.valuereadLn)读取一条记录(命名元组)。

Reflexion[i-1]:=temp看起来像一个记录数组(Python的list)。由于数组具有恒定的长度(在初始化时声明; n-1),因此新记录将存储在连续的插槽中。

我希望这能回答您有关Pascal代码的作用的问题...