Альтернатива locals() при печати таблицы с заголовком
[Python 3.1]
Изменить: ошибка в исходном коде.
Мне нужно напечатать таблицу. Первая строка должна быть заголовком, который состоит из имен столбцов, разделенных вкладками. Следующие строки должны содержать данные (также разделенные табуляцией).
Чтобы уточнить, допустим, у меня есть столбцы "скорость", "мощность", "вес". Первоначально я написал следующий код с помощью соответствующего вопроса, который я задавал ранее:
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')
Но потом я узнал, что мне следует избегать использования locals()
если возможно.
Теперь я застрял. Я не хочу печатать список всех имен столбцов более одного раза. Я не хочу полагаться на тот факт, что каждый словарь, который я создаю внутри f()
вероятно, будет перебирать свои ключи в том же порядке. И я не хочу использовать locals()
,
Обратите внимание, что функции print_table()
а также f()
делать много других вещей; поэтому я должен держать их отдельно.
Как мне написать код?
3 ответа
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__
Это также позволяет вам указать, какие из переменных должны быть столбцами, а не быть временными в функции.
Вы можете использовать OrderedDict, чтобы исправить порядок словарей. Но, как я понимаю, в этом даже нет необходимости. Вы всегда берете ключи от column_names
list (за исключением последней строки, я предполагаю, что это опечатка), поэтому порядок значений всегда будет одинаковым.
Альтернативой locals() будет использование модуля проверки
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 }