#python #dictionary
#python #словарь
Вопрос:
Arrite, python n00b здесь, пожалуйста, будьте нежны. 😉
Как вы можете видеть из следующего кода, у меня есть функция, которая хранит словари, содержащие информацию о разных списках, которые я хочу проанализировать и записать в файлы. Я застрял на том, как передать имя словаря функции поиска. Если я передаю его в виде строки, я получаю:
AttributeError: 'str' object has no attribute 'get'
Итак, вопрос: как мне передать lookup() имя словаря для поиска, например, параметра «URL» и получить результат обратно?
Заранее спасибо.
#!/usr/bin/env python3
from re import sub
from requests import get
from ipaddress import ip_network
def lookup(listname, key):
spamhaus_drop = {
"name" : "Spamhaus DROP",
"URL" : "https://www.spamhaus.org/drop/drop.txt",
"filename" : "spamhaus_drop.txt",
}
spamhaus_edrop = {
"name" : "Spamhaus EDROP",
"URL" : "https://www.spamhaus.org/drop/edrop.txt",
"filename" : "spamhaus_edrop.txt",
}
return listname.get(key)
def getnewlist(listname):
req = get(lookup(listname, 'URL'))
newlist = spamhaus_parse(req.text)
return newlist
def main():
newlist = getnewlist('spamhaus_drop')
return(0)
if __name__ == main():
main()
Комментарии:
1. для чего нужен ваш spamhaus_drop dict?
Ответ №1:
Вы не можете получить доступ к переменным динамически таким образом.
Поместите все ваши словари в другой словарь и используйте listname
в качестве ключа.
def lookup(listname, key):
dicts = {
'spamhaus_drop': {
"name" : "Spamhaus DROP",
"URL" : "https://www.spamhaus.org/drop/drop.txt",
"filename" : "spamhaus_drop.txt",
},
'spamhaus_edrop': {
"name" : "Spamhaus EDROP",
"URL" : "https://www.spamhaus.org/drop/edrop.txt",
"filename" : "spamhaus_edrop.txt",
}
}
return dicts[listname].get(key)
Комментарии:
1. Eet verks! Большое спасибо! Вы правите.
Ответ №2:
Вы должны использовать eval() для динамического доступа к переменным подобным образом
def lookup(listname, key):
spamhaus_drop = {
"name" : "Spamhaus DROP",
"URL" : "https://www.spamhaus.org/drop/drop.txt",
"filename" : "spamhaus_drop.txt",
}
spamhaus_edrop = {
"name" : "Spamhaus EDROP",
"URL" : "https://www.spamhaus.org/drop/edrop.txt",
"filename" : "spamhaus_edrop.txt",
}
return eval(listname).get(key)
Комментарии:
1. Я думал, что eval() не подходит, поскольку это угроза безопасности?
2. @DieterichBuxtehude Это только угроза безопасности, если ввод динамически предоставляется пользователем без фильтрации.
3. Но это все равно следует рассматривать как решение последней инстанции, почти всегда есть лучшие.