Python - как избежать exec для пакетирования? - PullRequest
1 голос
/ 23 сентября 2011

У меня есть существующее приложение на Python (ограниченное развертывание), для которого требуется возможность запускать пакеты / макросы (т.е. делать foo 3 раза, изменять x, делать y). В настоящее время я реализовал это как exec, работающий через текстовый файл, который содержит простой код Python для выполнения всех необходимых пакетных операций.

Однако exec является грязным (то есть проблемами безопасности), и есть также некоторые случаи, когда он не действует точно так же, как на самом деле имеет тот же код в вашем файле. Как я могу обойти с помощью exec? Я не хочу писать свой собственный язык мини-макросов, и пользователям нужно использовать несколько разных макросов для каждого сеанса, поэтому я не могу настроить его так, чтобы макрос представлял собой файл Python, который вызывает программное обеспечение, а затем запускает сам себя или что-то в этом роде. аналогичный.

Есть ли более чистый / лучший способ сделать это?

Псевдокод: в программном обеспечении он имеет что-то вроде: - когда макрос вызывается

for line in macrofile:
   exec line

и макрофайлы - это python, то есть что-то вроде:

property_of_software_obj = "some str"
software_function(some args)

и т.д.

1 Ответ

0 голосов
/ 23 сентября 2011

Рассматривали ли вы использовать сериализованный формат данных, как JSON?Он легкий, его легко перевести на словари Python, и все классные дети его используют.

Вы можете построить данные осмысленным образом, но не требующим реального кода.Затем вы можете прочитать эту конструкцию, взять нужные части, а затем передать их функции или классу.

Редактировать : добавлен пропуск в наглядном примере возможной спецификации JSON.

Ваш JSON:

{
    "macros": [
        {
            "function": "foo_func", 
            "args": {
                "x": "y", 
                "bar": null
            }, 
            "name": "foo", 
            "iterations": 3
        }, 
        {
            "function": "bar_func", 
            "args": {
                "x": "y", 
                "bar": null
            }, 
            "name": "bar", 
            "iterations": 1
        }
    ]
}

Затем вы анализируете его с помощью json lib Python:

import json

# Get JSON data from elsewhere and parse it
macros = json.loads(json_data)

# Do something with the macros
for macro in macros:
    run_macro(macro) # For example

И результирующие данные Python синтаксически почти идентичны JSON, за исключениемнекоторые ключевые слова, такие как True, False, None (true, false, null в формате JSON).

{
    'macros': [
        {
            'args': 
            {
                'bar': None, 
                'x': 'y'
            },
             'function': 'foo_func',
             'iterations': 3,
             'name': 'foo'
        },
        {
            'args': 
            {
                'bar': None, 
                'x': 'y'
            },
             'function': 'bar_func',
             'iterations': 1,
             'name': 'bar'
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...