NameError для переменной, значение которой у меня не будет до времени выполнения - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть словарь для создания операторов вставки для теста, который я делаю.Значение вставки для поля описания должно иметь идентификатор текущей строки, КОТОРОГО У меня НЕ ИМЕЕТСЯ, пока я не запустил программу.Кроме того, этот идентификатор увеличивается на 1 каждый раз, когда я вставляю, и описание для каждой вставки должно иметь соответствующий ему row_num.

Я хочу заранее загрузить словарь всех полей в таблице, чтобы я могиспользуйте информацию в нем, чтобы создать операторы вставки и изменения для моего теста.Я не хочу жестко кодировать test_value поля в коде;Я хочу, чтобы то, что должно быть в нем, было определено в словаре и вычислено во время выполнения.Словарь предназначен для использования в качестве шаблона для значения поля.

Я получаю максимальный идентификатор из базы данных и добавляю к нему 1.Это номер строки.Я хочу, чтобы значение, которое вставляется в описание, было, например, Row Num: {row_num} - Num Inserts {num_inserts} - Wait Time {wait_time}.У меня есть num_inserts и wait_time из файла конфигурации.Они определены заранее.

Я получаю NameError: name 'row_num' is not defined независимо от того, как я пытался определить row_num в этом словаре.Когда я импортирую словарь, row_num еще не доступен, поэтому возникает ошибка.

Вот небольшой фрагмент моего словаря полей базы данных (в этом примере - таблица пользователей):

all_fields_dict = {
    'users':
       {
        'first_name': {
            'db_field' : 'FirstName',
            'datatype': 'varchar(50)',
            'test_value': {utils.calc_field_value(['zfill', 'FirstName'])}, # another attempt that didn't work
            'num_bool': False
        },
        'username': {
            'db_field' : 'username',
            'datatype': 'varchar(50)',
            'test_value': f"user{utils.get_random_str(5)}", # this works, but it's a diff kind of calculation
            'num_bool': False,
        },
        'description': {
            'db_field' : 'description',
            'datatype': 'text',
            'test_value': f"{utils.get_desc_info(row_num)}", # one of my attempts - fails
            'num_bool': False,
        },
   }
}

Среди прочего я пытался:

  1. {row_num}:

    test_value: f"{row_num"}
    
  2. , вызывая функцию, которая возвращает номер строки:

    def get_row_num()
        return row_num
    
    test_value: f"{utils.get_row_num()}
    
  3. вызов функции, вызывающей функцию get_row_num:

    def get_desc_info():
        row_num = get_row_num()
        return f"Row Num: {row_num} - Wait Time: {wait_time} - Total Inserts: {num_inserts}"
    
    test_value: f"{utils.get_desc_info()}"
    
  4. Я даже пытался создать функцию с переключателемкоторый возвращает функцию get_row_num, если rnum передается как test_value

    def calc_field_value(type):
    
        switcher = {
                'rnum': get_row_num(),
                etc
        }
        return switcher[type]
    
    test_value: f"{utils.calc_field_value('rnum')
    
  5. Я пытался объявить его глобальным практически во всех местах, о которых я могу думать.

  6. Я не пробовал eval из-за всех предупреждений о безопасности, которые я читал об этом.

То же самое, каждый раз.

1 Ответ

0 голосов
/ 20 ноября 2018

Инициализируйте test_field для некоторого значения заполнителя или просто не устанавливайте значение вообще.

Затем, позже в коде, когда вы знаете значение, обновите dict.

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