как установить функцию Python в dict - PullRequest
0 голосов
/ 16 марта 2011

это мой код:

a= {'u':exec("def u(str):return Unicode(str,'utf-8')"),}
print a

, но он показывает ошибку:

SyntaxError: invalid syntax
(mysite)zjm1126@zjm1126-G41MT-S2:~/桌面/test$ python a.py
  File "a.py", line 5
    a= {'u':exec("def u(str):return Unicode(str,'utf-8')"),}
               ^
SyntaxError: invalid syntax

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

что я могу сделать,

спасибо

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Вместо этого можно сохранить функцию или код в виде текста:

a= {'u': lambda x: Unicode(x,'utf-8')}

или

a= {'u':"def u(str):return Unicode(str,'utf-8')",}

и затем выполните его как

exec(a['u'])
0 голосов
/ 16 марта 2011

Я не знаю, какой это будет ответ, но , похоже, сработает, если вы сначала извлечете exec для параметра функции ...

>>> exec("def t(x): return x**x")
>>> t(5)
3125
>>> a={'t': t}
>>> a['t'](5)
3125

Теперь, когда у меня была возможность подумать об этом, это имеет смысл. Exec оценивает блок кода, но ничего не возвращает. Мой фрагмент кода выше объявляет функцию t , которую можно присвоить дикту.

0 голосов
/ 16 марта 2011

exec не возвращает значение; вместо этого он оценивает некоторый код в текущем контексте (по умолчанию) или в пользовательском контексте. Под «контекстом» я подразумеваю диктаты местных жителей и глобалов.

Похоже, вы хотите следующее:

a = {  }
exec "def u(string): return unicode(string, 'utf-8')" in { }, a
# a now contains method by name 'u', just like your original example
a['u']('cheese')    # -> u'cheese'

Это работает, выполняя строку кода с временным диктом ({ }) для хранения сгенерированных глобальных переменных и a для хранения локальных. См. документы для получения дополнительной информации.

Вы можете использовать eval(), если вам нужно оценить значение блока кода (хотя вы не можете eval() объявление метода).

Обратите внимание, что unicode должен иметь строчную букву U.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...