var括号内

时间:2013-11-22 10:47:32

标签: python syntax

我有这个......

   fileExt = {'png': "'Content-Type': 'image/png'", 'jpe': "'Content-Type':
   'image/jpeg'", 'jpg': "'Content-Type': 'image/jpeg'", 
   'png': "Content-Type': 'image/png'", 'mp4': "'Content-Type': 'video/mpeg'",
   'mp3': "'Content-Type': 'audio/mpeg'", '3gp': "'Content-Type': 'video/3gpp'",
   'flv': "'Content-Type': 'video/x-flv'", 'flv': "'Content-Type': 'video/x-flv'"}
   handler = fileExt.get(ext)
   go = "'"+handler
   key.copy(key.bucket, key.name, preserve_acl=True, metadata={go})

我收到了这个错误...

   Traceback (most recent call last):
  File "s3ContentType.py", line 43, in <module>
   key.copy(key.bucket, key.name, preserve_acl=True, metadata={go})
  File "/task/__pips__/boto/s3/key.py", line 474, in copy
   encrypt_key=encrypt_key)
  File "/task/__pips__/boto/s3/bucket.py", line 723, in copy_key
   headers = boto.utils.merge_meta(headers, metadata, provider)
  File "/task/__pips__/boto/utils.py", line 172, in merge_meta
   for k in metadata.keys():
AttributeError: 'set' object has no attribute 'keys'

但是如果我在元数据括号中明确地放置一个字符串就可以了。

  key.copy(key.bucket, key.name, preserve_acl=True, metadata={'Content-Type': 'image/png'})

什么给出,如何在括号内包含var

3 个答案:

答案 0 :(得分:2)

您正在构建两个不同的对象:

foo = {'a', 'b', 'c'}

set,而

bar = {'a': 'b', 'c': 'd'}

dictionary。你当然可以在构造一个dict时引用变量:

mimetype = "image/png"
bar = {'Content-Type': mimetype}

字典将键映射到值(因此:),而集合只是不同值的集合。你正在调用的函数需要一个字典,所以你必须创建一个字典。如果你有一本字典并希望通过它(从上面继续),你可以这样做:

mimetype = "image/png"
bar = {'Content-Type': mimetype}
key.copy(key.bucket, key.name, preserve_acl=True, metadata=bar)

(请注意链接转到python 3文档,但是自python 2以后,set和dicts没有真正改变)


编辑:正如接受的答案所说,你必须使用嵌套字典。问题是,为什么它不起作用?

否则,您正在创建一个包含先前存储在fileExt字典中的字符串的集合,例如“Content-Type:'image / png'”。 Python不会解释这个字符串,这就是为什么它在你写{"Content-Type: 'image/png'"}时不会创建字典的原因。

答案 1 :(得分:1)

当您说{go}时,您实际上是在创建set,而不是dict。并且套装没有钥匙。

print type({"Welcome"})
print type({"1":"Welcome"})

<强>输出

<type 'set'>
<type 'dict'>

但是当你说{'Content-Type': 'image/png'}时,你实际上是在创建一个dict,这就是它的工作原理。

答案 2 :(得分:1)

您也可以使用嵌套字典来保存文件扩展名和内容,如

    fileExt = {'png': {'Content-Type': 'image/png'}, 'jpe': {'Content-Type':'image/jpeg'}, 
    'jpg': {'Content-Type': 'image/jpeg'}, 'png': {'Content-Type': 'image/png'}, 
    'mp4': {'Content-Type': 'video/mpeg'}, 'mp3': {'Content-Type': 'audio/mpeg'}, 
    '3gp': {'Content-Type': 'video/3gpp'}, 'flv': {'Content-Type': 'video/x-flv'}, 
    'flv': {'Content-Type': 'video/x-flv'}}
    handler = fileExt.get(ext)

然后你将直接在元数据中使用处理程序,比如

    key.copy(key.bucket, key.name, preserve_acl=True, metadata=handler)