Альтернатива locals () при печати таблицы с заголовком - PullRequest
1 голос
/ 01 ноября 2010

[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 ]

2 голосов
/ 01 ноября 2010
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__

Это также позволяет вам указать, какие переменные должны быть столбцами, а не быть временными в функции.

0 голосов
/ 01 ноября 2010

альтернативой localals () будет использование модуля 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 }
0 голосов
/ 01 ноября 2010

Вы можете использовать OrderedDict , чтобы исправить порядок словарей. Но, как я понимаю, в этом даже нет необходимости. Вы всегда берете ключи из списка column_names (за исключением последней строки, я предполагаю, что это опечатка), поэтому порядок значений всегда будет одинаковым.

...