[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()
执行许多其他操作;所以我必须将它们分开。
我该如何编写代码?
答案 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 }