我在运行前没有值的变量的NameError

时间:2018-11-19 22:35:04

标签: python python-3.x dictionary

我有一个字典,可以为正在执行的测试创建插入语句。 description字段的插入值需要具有当前行的ID,直到运行程序我才知道。另外,每次插入时,该ID都会增加1,并且每个插入的描述都必须具有其对应的row_num。

我想提前加载表中所有字段的字典,因此我可以使用其中的信息为测试创建insert和alter语句。我不想在代码中对字段的test_value进行硬编码。我希望在字典中定义其中的内容,并在运行时进行计算。该字典本来是我希望字段值成为的模板。

我正在从数据库中获取最大ID,并向其中添加1。那是行号。我希望为描述插入的值例如为Row Num: {row_num} - Num Inserts {num_inserts} - Wait Time {wait_time}。我从配置文件中获取了num_inserts和wait_time。它们是预先定义的。

无论我如何尝试在此字典中定义row_num,我都会得到NameError: name 'row_num' is not defined。当我导入字典时,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. 调用返回行num的函数:

    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. 我什至尝试过创建一个带有切换器的函数,如果'rnum'作为test_value传入,该切换器将返回get_row_num函数

    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 :(得分:0)

test_field初始化为某个占位符值,或者根本不设置任何值。

然后,在代码中稍后您确实知道该值时,更新字典。