在打印带有标题的表时替代locals()

时间:2010-11-01 08:25:27

标签: python python-3.x list-comprehension locals

[Python 3.1]

编辑:原始代码中的错误。

我需要打印一张桌子。第一行应该是标题,它由由制表符分隔的列名组成。以下行应包含数据(也以制表符分隔)。

为了澄清,让我说我有“速度”,“力量”,“重量”的列。我最初在前面提到的related question的帮助下编写了以下代码:

column_names = ['speed', 'power', 'weight']

def f(row_number):
  # some calculations here to populate variables speed, power, weight
  # e.g., power = retrieve_avg_power(row_number) * 2.5
  # e.g., speed = math.sqrt(power) / 2
  # etc.
  locals_ = locals()
  return {x : locals_[x] for x in column_names}

def print_table(rows):
  print(*column_names, sep = '\t')
  for row_number in range(rows):
    row = f(row_number)
    print(*[row[x] for x in component_names], sep = '\t')

但后来我了解到我应该avoid using locals() if possible

现在我被卡住了。我不想多次输入所有列名的列表。我不想依赖于我在f()内创建的每个字典都可能以相同的顺序迭代其键的事实。我不想使用locals()

请注意,函数print_table()f()执行许多其他操作;所以我必须将它们分开。

我该如何编写代码?

3 个答案:

答案 0 :(得分:2)

class Columns:
    pass

def f(row_number):
    c = Columns()
    c.power = retrieve_avg_power(row_number) * 2.5
    c.speed = math.sqrt(power) / 2
    return c.__dict__

这也允许您指定哪些变量用作列,而不是在函数中是临时的。

答案 1 :(得分:0)

您可以使用OrderedDict来修复词典的顺序。但正如我所看到的那样,甚至都没有必要。你总是从column_names列表中取出密钥(最后一行除外,我认为这是一个错字),因此值的顺序将始终相同。

答案 2 :(得分:0)

locals()的替代方案是使用inspect模块

import inspect

def f(row_number):
    # some calculations here to populate variables speed, power, weight
    # e.g., power = retrieve_avg_power(row_number) * 2.5
    # e.g., speed = math.sqrt(power) / 2
    # etc.
    locals_ = inspect.currentframe().f_locals
    return {x : locals_[x] for x in column_names }