Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在变量名中使用字典(或其他结构)键_Python_Django - Fatal编程技术网

Python 在变量名中使用字典(或其他结构)键

Python 在变量名中使用字典(或其他结构)键,python,django,Python,Django,这是一个用于将其键传递到下面的循环的词汇表 SIZES = OrderedDict(( ('image_main', (800, 800)), ('thumbsize_big', (200, 200)), ('thumbsize_small', (100, 100)))) 此代码中的实例是一个模型实例。传递给字典的键相当于我试图将值输入的字段名。例如,在本例中,字段路径将读取“self.instance.image_main”。 问题是“self.instance.ke

这是一个用于将其键传递到下面的循环的词汇表

SIZES = OrderedDict((
    ('image_main', (800, 800)),
    ('thumbsize_big', (200, 200)),
    ('thumbsize_small', (100, 100))))
此代码中的实例是一个模型实例。传递给字典的键相当于我试图将值输入的字段名。例如,在本例中,字段路径将读取“self.instance.image_main”。 问题是“self.instance.key”和字典中的key似乎不起作用。我尝试了很多方法,比如连接“self.instance”。+“键”甚至“self.instance[key]”,但它不起作用

def execute(self):
    for key, value in self.SIZES.items():
        save_dir = self.base_dir + self.slug + '_' + key
        # Save images in fields. 
        if self.has_iterated == 0:
            # I need self.instance.main_image with main_image dynamically generated form the key
            self.instance.key = self.saving_path + self.slug + '_' + key + '.' + self.image_format 
你有没有其他办法让它工作?目标不是硬编码循环中的字段名,而是让它从我设置变量的代码上方传递。代码当然是简化的,但在实际环境中这是为了避免枯燥

更新:使用Lambo实现修改代码。 循环的第二次迭代似乎导致了问题

 def execute(self):
    for key, value in self.SIZES.items():
        save_dir = self.base_dir + self.slug + '_' + key
        # Save images on disk. No iteration required: at each iteration, a new file is created and stored.
        self.save_image(self.resize_image(self.image, value),save_dir, self.PNG_COMPRESS, self.JPG_COMPRESS)
        # Save images in fields. Iteration numbered: otherwise field is overwritten at each iteration
        if self.has_iterated == 0:
            setattr(self.instance, key, self.saving_path + self.slug + '_' + key + '.' + self.image_format)
        elif self.has_iterated == 1:
            setattr(self.instance, key, self.saving_path + self.slug + '_' + key + '.' + self.image_format)
        else:
            setattr(self.instance, key, self.saving_path + self.slug + '_' + key + '.' + self.image_format)
        self.has_iterated += 1

    return self.instance

您想使用
setattr()
setattr(x,'y',z)
相当于
x.y=z
(请注意,第二个参数是字符串-在您的情况下,它将是
字符串)。因此,在您的情况下,您可以:

setattr(self.instance, key, self.saving_path + self.slug + '_' + key + '.' + self.image_format)

谢谢,这很有道理。我在循环中运行了其中的几个,看起来第一个运行得很好,但后面的运行得不好。我是否需要在每次迭代中使用它来“清除”某些内容?在没有看到更多代码的情况下,很难知道。如果您将有效的对象、字符串和值传递给
setattr
函数,上述解决方案应该始终有效……非常奇怪,当我仅在/list/joined路径(/media/dir/test\u image\u main.png)中放置第一次迭代时,我没有收到此错误消息:可疑文件操作位于基本路径组件之外(/Users/COMPANY/Documents/Apps_和_Sites/Python_Apps/Django Apps/dirworld/src/media)。好像迭代改变了什么。这听起来像是传递给self.saving\u path+self.slug+'.+key+'.+self.image\u格式的值有问题,而不是
setattr()
方法。尝试使用
setattr(self.instance,key,1)
运行,以帮助调试问题……但当我硬编码字段名称时,效果很好:所有迭代都可以使用路径。当我把1和setattr放在一起时,我得到了“'int'对象没有属性'image'”什么东西不起作用?self.instance[key]是您在这里需要的。这是我所期望的,但它会生成:“Document”对象不支持项分配。文档是我的模型。