Передача именованного имени поля кортежа для ._replace в качестве аргумента из функции - PullRequest
0 голосов
/ 18 марта 2020

Итак, у меня есть именованный кортеж, скажем:

from collections import namedtuple

Symbol = namedtuple('Symbol', 'name code industry date_au open high low close volume weekday_au date_utc_unixtimestamp prev_volume', defaults = ('DEFAULT', 'DEF', 'DEFAULT', '01/01/1970', 0.0, 0.0, 0.0, 0.0, 0, 'Mon', 0, 0))

Я делаю некоторые тестовые данные:

ont_data = [
Symbol(name = '1300 SMILES LIMITED', code ='ONT', industry = 'Tech', date_au = '03/05/2020', open = 10.0, high = 12.0, low = 9.5, close = 11.0, volume = 1000, weekday_au = 'Sun', date_utc_unixtimestamp = 123),
Symbol(name = '1300 SMILES LIMITED', code ='ONT', industry = 'Tech', date_au = '15/05/2020', open = 12.0, high = 12.0, low = 5.5, close = 9.0, volume = 999, weekday_au = 'Fri', date_utc_unixtimestamp = 125),
Symbol(name = '1300 SMILES LIMITED', code ='ONT', industry = 'Tech', date_au = '17/01/2020', open = 4.0, high = 90.0, low = 54.5, close = 74.0, volume = 27, weekday_au = 'Wed', date_utc_unixtimestamp = 5)
]

И теперь я хочу создать копию этого именованного кортежа и сделать некоторые замены динамически для определенного атрибута:

def set_prev_val(symbol, prev_values, field_to_update):
    """
    Iterate over a copy of Symbol named tuple and replace some attribute values.

    Return a copy of Symbol named tuple with replaced previous values of some field_to_update

    args:
      @symbol - A descending sorted named tuple representing stock symbol data
      @prev_values - A list of previous values (from a descending sorted Symbol)
      @field_to_update - A field in a Symbol named tuple to update
   """
    symbol_copy = symbol

    for row in range(0, len(symbol_copy)):
        symbol_copy[row] = symbol[row]._replace(field_to_update = prev_values[row])
    return symbol_copy

Когда я проверяю это с помощью, скажем, prev_values_data = [1,2,3], я получаю:

ValueError: Got unexpected field names: ['field_to_update']

Где как то, что я хочу, это поля prev_volume для быть обновленным со значениями prev_values_data

Я думаю, что вместо передачи строкового значения field_to_update в качестве имени аргумента берется фактическое имя атрибута в именованном кортеже !!!

Могу ли я передать какой-либо атрибут 'name' для замены в качестве аргумента функции в вызов ._replace в именованном кортеже? (при условии, что в именованных именах атрибутов кортежа существует name)

Python 3.7

1 Ответ

0 голосов
/ 18 марта 2020

Создать анонимный dict и распаковать его:

symbol_copy[row] = symbol[row]._replace(**{field_to_update: prev_values[row]})

Обычный аргумент ключевого слова, передаваемый через field_to_update=prev_values[row], является статическим; он передает левую часть в виде фиксированной строки, а не переменной (он даже не позволяет заключать ее в кавычки). Но буквенный синтаксис dict требует кавычки для строкового ключа, поэтому он обрабатывает field_to_update как переменную, как и ожидалось.

...