Альтернатива 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 }
Другие вопросы по тегам