Я пытаюсь собрать хороший ответ из всех постов, поэтому помогите мне отредактировать это:
Вот способ сделать это, хотя он преобразует строки и не поддерживает 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 предоставляет довольно хорошую утилиту для проведения такого рода сравнения.
Для этого вы можете использовать метод 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 он делает следующее:
Искусственный пример
к сценарию). Теперь потребитель может вызвать contastedExample.hello ()
.) hi
как указывающий на hello
Оказывается (спасибо, комментаторы!), вам действительно нужно использовать оператор exec
. Ой. Пересмотренные примеры:
exec
Определение (Выглядит знакомо!)
надуманным примером
). Теперь потребитель может вызвать contastedExample.hello ()
.) hi
как указывающий на hello
Оказывается (спасибо, комментаторы!), вам действительно нужно использовать оператор exec
. Ой. Пересмотренные примеры:
exec
Определение (Выглядит знакомо!)
надуманным примером
). Теперь потребитель может вызвать contastedExample.hello ()
.) hi
как указывающий на hello
Оказывается (спасибо, комментаторы!), вам действительно нужно использовать оператор exec
. Ой. Пересмотренные примеры:
exec
Определение (Выглядит знакомо!) )
привет
как указывающий на привет
Оказывается (спасибо комментаторы!), что вам действительно нужно использовать оператор exec
. Ой. Пересмотренные примеры:
exec
Определение (Выглядит знакомо!) )
привет
как указывающий на привет
Оказывается (спасибо комментаторы!), что вам действительно нужно использовать оператор 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")
Как указывали другие, вы можете загрузить текст в строку и использовать 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)