Под управлением код Python содержится в строке

Я пытаюсь собрать хороший ответ из всех постов, поэтому помогите мне отредактировать это:

Вот способ сделать это, хотя он преобразует строки и не поддерживает Unicode , он должен быть переносимым, что является плюсом:

bool caseInsensitiveStringCompare( const std::string& str1, const std::string& str2 ) {
    std::string str1Cpy( str1 );
    std::string str2Cpy( str2 );
    std::transform( str1Cpy.begin(), str1Cpy.end(), str1Cpy.begin(), ::tolower );
    std::transform( str2Cpy.begin(), str2Cpy.end(), str2Cpy.begin(), ::tolower );
    return ( str1Cpy == str2Cpy );
}

Из того, что я прочитал, это более переносимо, чем stricmp (), потому что stricmp () на самом деле не является частью библиотеки std, но реализуется только большинство поставщиков компиляторов.

Чтобы получить действительно дружественную для Unicode реализацию, кажется, вы должны выйти за пределы библиотеки std. Одной из хороших сторонних библиотек является IBM ICU (International Components for Unicode)

Также boost :: iequals предоставляет довольно хорошую утилиту для проведения такого рода сравнения.

8
задан Artjom B. 18 September 2015 в 11:32
поделиться

4 ответа

Для этого вы можете использовать метод eval (string) .

Определение

eval (code, globals = None, locals = None)
Код представляет собой стандартный код Python - это означает, что он все еще требует правильного отступа.

Глобальные переменные могут иметь пользовательские __ builtins __ , которые могут быть полезны в целях безопасности.

Пример

eval("print('Hello')")

Будет выводить на консоль hello . Вы также можете указать локальные и глобальные переменные для кода, который будет использовать:

eval("print('Hello, %s'%name)", {}, {'name':'person-b'})

Проблемы безопасности

Однако будьте осторожны. Любой пользовательский ввод будет выполнен. Подумайте:

eval("import os;os.system('sudo rm -rf /')")

Есть несколько способов обойти это. Самый простой - это сделать что-нибудь вроде:

eval("import os;...", {'os':None})

Это вызовет исключение, а не стирает ваш жесткий диск. Пока ваша программа является настольной, это может быть проблемой, если люди распространяют скрипты, который, как я полагаю, предназначен.

Странный пример

Вот пример использования eval довольно странно:

def hello() : print('Hello')
def world() : print('world')
CURRENT_MOOD = 'happy'

eval(get_code(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))

В строке eval он делает следующее:

  1. Дает текущему модулю другое имя (оно становится Искусственный пример к сценарию). Теперь потребитель может вызвать contastedExample.hello () .)
  2. Он определяет hi как указывающий на hello
  3. Он объединяет этот словарь со списком текущих глобальных переменных. в исполняющем модуле.

FAIL

Оказывается (спасибо, комментаторы!), вам действительно нужно использовать оператор exec . Ой. Пересмотренные примеры:


exec Определение

(Выглядит знакомо!)

  1. Присваивает текущему модулю другое имя (для сценария оно становится надуманным примером ). Теперь потребитель может вызвать contastedExample.hello () .)
  2. Он определяет hi как указывающий на hello
  3. Он объединяет этот словарь со списком текущих глобальных переменных. в исполняющем модуле.

FAIL

Оказывается (спасибо, комментаторы!), вам действительно нужно использовать оператор exec . Ой. Пересмотренные примеры:


exec Определение

(Выглядит знакомо!)

  1. Присваивает текущему модулю другое имя (для сценария оно становится надуманным примером ). Теперь потребитель может вызвать contastedExample.hello () .)
  2. Он определяет hi как указывающий на hello
  3. Он объединяет этот словарь со списком текущих глобальных переменных. в исполняющем модуле.

FAIL

Оказывается (спасибо, комментаторы!), вам действительно нужно использовать оператор exec . Ой. Пересмотренные примеры:


exec Определение

(Выглядит знакомо!) )

  • Он определяет привет как указывающий на привет
  • Он объединил этот словарь со списком текущих глобальных переменных в исполняющем модуле.
  • FAIL

    Оказывается (спасибо комментаторы!), что вам действительно нужно использовать оператор exec . Ой. Пересмотренные примеры:


    exec Определение

    (Выглядит знакомо!) )

  • Он определяет привет как указывающий на привет
  • Он объединил этот словарь со списком текущих глобальных переменных в исполняющем модуле.
  • FAIL

    Оказывается (спасибо комментаторы!), что вам действительно нужно использовать оператор exec . Ой. Пересмотренные примеры:


    exec Определение

    (Выглядит знакомо!) Exec - это инструкция:
    exec «код» [в области видимости] Где область видимости - это словарь как локальных, так и глобальных переменных. Если это не указано, он выполняется в текущей области.

    Код представляет собой просто стандартный код Python - это означает, что он все еще требует правильного отступа.

    exec Пример

    exec "print('hello')"
    

    Выводит на консоль hello . Вы также можете указать локальные и глобальные переменные для используемого кода:

    eval "print('hello, '+name)" in {'name':'person-b'}
    

    exec Проблемы безопасности

    Однако будьте осторожны. Любой пользовательский ввод будет выполнен. Рассмотрим:

    exec "import os;os.system('sudo rm -rf /')"
    

    Оператор печати

    Как также отмечают комментаторы, print является оператором во всех версиях Python до 3.0. В версии 2.6 поведение можно изменить, набрав из __future__ import print_statement . В противном случае используйте:

    print "hello"
    

    Вместо:

    print("hello")
    
    25
    ответ дан 3 November 2019 в 14:20
    поделиться

    Как указывали другие, вы можете загрузить текст в строку и использовать exec «codestring» . Если он уже содержится в файле, использование execfile позволит избежать его загрузки.

    Одно замечание по производительности: вам следует избегать выполнения кода несколько раз, поскольку синтаксический анализ и компиляция исходного кода python - медленный процесс. т.е. нет:

    def keydown(self, key):
        exec user_code
    

    Вы можете немного улучшить это, скомпилировав исходный код в объект кода (с помощью compile () и выполнив это, или лучше, создав функцию, которую вы держите, и строить только один раз. Либо потребуйте, чтобы пользователь написал "def my_handler (args ...)", либо добавьте его самостоятельно и сделайте что-то вроде:

    user_source = "def user_func(args):\n" + '\n'.join("    "+line for line in user_source.splitlines())
    
    d={}
    exec user_source in d
    user_func = d['user_func']
    

    Затем позже:

    if key == K_a:
       user_func(args)
    
    2
    ответ дан 3 November 2019 в 14:20
    поделиться

    eval или exec.

    0
    ответ дан 3 November 2019 в 14:20
    поделиться

    Вы можете использовать eval ()

    0
    ответ дан 3 November 2019 в 14:20
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: