2013-02-26 141 views
0

我有这个代码,我想优化,因为它启动它获得音量:(。我想制作一个数组,并从他调用的值,而不是像每个对象创建代码我现在做:我怎样才能使它动态

post_data_groups = {'profile': '46', 'clear': 'Remove+Avatar'} 
post_data_documents = {'folder1': '30', 'remove': 'Delete+Documents'} 

urlAdmin_groups = 'http://site.com/management.php?Category=6&uid=196' 
urlModerator_groups = 'http://site.com/management.php?Category=6&uid=197' 
.......... 

,然后文件:

urlAdmin_documents = 'http://site.com/management.php?Category=3&uid=196' 
urlModerator_documents = 'http://site.com/management.php?Category=3&suid=197' 
.... and so on 
data_groups= urllib.urlencode(post_data_groups) 
data_documents= urllib.urlencode(post_data_documents) 

然后我打电话给他们这样的:

response = opener.open(urlAdmin_groups, data_groups) 
response = opener.open(urlAdmin_documents, data_documents) 
........... and so on 
the_page = response.read() 

因为只有类别和uid更改,我怎样才能使循环调用它们?

回答

2

使用字符串作为模板:

url = 'http://site.com/management.php?Category={cat}&uid={uid}' 

那么你可以使用字符串的方法.format()填补插槽:

response = opener.open(url.format(cat=3, uid=196), data)) 
the_page = response.read() 

你必须这样扩大到使用循环,在那里你迭代东西然后提供的类别和UID,但你明白了。也许一个映射将工作:

groups = { 
    Admin: {'cat': 3, 'uid': 196}, 
    ... 
} 

for groupname, urlvalues in groups.iteritems(): 
    response = opener.open(url.format(**urlvalues), data_groups)) 

其中**格式适用字典为一组关键字参数;使用.format(**urlvalues)基本上翻译为.format(cat=urlvalues['cat'], uid=urlvalues['uid'])

+0

我试过的东西,但我没有找到神奇的解决方案。你能给我一个循环的例子吗? – 2013-02-26 15:52:13

+0

@MikeThunder:已完成。 :-) – 2013-02-26 15:53:38

3

基本上这是一个伟大的使用情况为map内置功能:

url = 'http://site.com/management.php?Category={cat}&uid={uid}' 
cat_uids = [ (3,196), (3,197), ... ] # read thos from config file or... 
urls = [ url%cat_uid for cat_uid in cat_uids ] 
responses = map(opener.open, urls) 
pages = map(response_class.read,responses) # where response_class is the class returned by open()