Могу ли я написать код Python, который изменяет себя во время выполнения?

Я имею в виду,

target_ZCR_mean = sample_dataframe_summary['ZCR'][1]
target_ZCR_std = sample_dataframe_summary['ZCR'][2]
lower_ZCR_lim = target_ZCR_mean - target_ZCR_std
upper_ZCR_lim = target_ZCR_mean + target_ZCR_std

target_RMS_mean = sample_dataframe_summary['RMS'][1]
target_RMS_std = sample_dataframe_summary['RMS'][2]
lower_RMS_lim = target_RMS_mean - target_RMS_std
upper_RMS_lim = target_RMS_mean + target_RMS_std

target_TEMPO_mean = sample_dataframe_summary['Tempo'][1]
target_TEMPO_std = sample_dataframe_summary['Tempo'][2]
lower_TEMPO_lim = target_TEMPO_mean - target_TEMPO_std
upper_TEMPO_lim = target_TEMPO_mean + target_TEMPO_std

target_BEAT_SPACING_mean = sample_dataframe_summary['Beat Spacing'][1]
target_BEAT_SPACING_std = sample_dataframe_summary['Beat Spacing'][2]
lower_BEAT_SPACING_lim = target_BEAT_SPACING_mean - target_BEAT_SPACING_std
upper_BEAT_SPACING_lim = target_BEAT_SPACING_mean + target_BEAT_SPACING_std

каждый блок из четырех строк кода очень похож друг на друга, за исключением нескольких символов.

Могу ли я написать функцию, класс или какой-либо другой фрагмент кода, чтобы я мог обернуть в него только шаблон из четырех строк кода и позволить ему изменять себя во время выполнения, чтобы код выполнял работу, указанную выше .. .?

Кстати, я использую python 3.6.


person Salai V V    schedule 16.05.2018    source источник
comment
Не могли бы вы объяснить, чего вы пытаетесь достичь с помощью этого кода? Вам нужно только сохранить эти значения?   -  person May.D    schedule 16.05.2018
comment
попробуйте декораторы, codementor.io/sheena/   -  person akshat    schedule 16.05.2018
comment
Нет, вы не можете написать код Python, который изменяет себя во время выполнения. Но в любом случае это неправильный подход. Используйте структуру данных, чтобы фиксировать закономерности, а не пытаться писать код на лету. Как в решении FHTMitchell.   -  person BoarGules    schedule 16.05.2018


Ответы (1)


Если вы обнаружите, что храните много таких переменных, особенно если они связаны, почти наверняка есть лучший способ сделать это. Динамическое изменение источника никогда не является решением. Один из способов - использовать функцию для сохранения повторяющейся логики и использовать namedtuple для хранения результирующих данных:

import collections
Data = collections.namedtuple('Data', 'mean, std, lower_lim, upper_lim')

def get_data(key, sample_dataframe_summary):
     mean = sample_dataframe_summary[key][1]
     std = sample_dataframe_summary[key][2]
     lower_lim = mean - std
     upper_lim = mean + std
     return Data(mean, std, lower_lim, upper_lim)

zcr = get_data('ZCR', sample_dataframe_summary)
rms = get_data('RMS', sample_dataframe_summary)
tempo = get_data('Tempo', sample_dataframe_summary)
beat_spacing = get_data('Beat Spacing', sample_dataframe_summary)

тогда вы можете получить доступ к данным с помощью обозначения ., например zcr.mean и tempo.upper_lim

person FHTMitchell    schedule 16.05.2018