Передача имени словаря в качестве параметра функции поиска

#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. Но это все равно следует рассматривать как решение последней инстанции, почти всегда есть лучшие.