2015-04-12 1 views
1

Возможно ли в Python отслеживать и фильтровать функции, вызываемые в строках во время прогона программы? Я хочу добавить приложение sys.setdefaultencoding("utf-8"), и я хочу установить некоторые защитники для прогнозирования потенциальных проблем с неправильным использованием стандартных функций (например, len) для обработки таких строк.Функции трассировки, вызываемые в строках Python

+1

Я предполагаю, что, несмотря на советы, которые вы недавно получили о [Опасностей sys.setdefaultencoding ('UTF-8')] (HTTP: // StackOverflow. com/questions/28657010/dangers-of-sys-setdefaultencodingutf-8) (также, [Hack Jinja2 для кодирования с 'utf-8' вместо' ascii'?] (http://stackoverflow.com/q/28642781/ 4014959)), что вы все еще решили использовать его ... –

+1

Разве это не факт, что вам уже нужно начинать внедрять хаки, подобные этим признакам, для вас, что это плохая идея возиться с 'sys.setdefaultencoding()'? Используйте unicode внутри, [переходите Unicode к шаблонам Jinja] (http://jinja.pocoo.org/docs/dev/api/#unicode), и только конвертируйте в/из 'utf-8' на своих границах системы. –

+0

@ PM2Ring Мне нужно исправить http://issues.roundup-tracker.org/issue2550811 ASAP, потому что он блокирует следующий выпуск Roundup и его разработку, а переход на использование unicode внутри выглядит как эпическая задача, которая займет много времени и перерыв существующего механизма шаблонов (TAL) и расширений. –

ответ

2

Вы можете заменить встроенную команду:

import __builtin__ 

real_len = __builtin__.len 

def checked_len(s): 
    ... do extra checks ... 
    return real_len(s) 

__builtin__.len = checked_len 
+0

Это работает для 'len', но не для других функций. Как избежать проверки строк, где ее законно использовать 'len', потому что мне нужно' len' в байтах (например, вычисление HTTP-заголовков). Существуют переменные и операции (не строковое содержимое), для которых эта проверка не должна срабатывать. Можно настроить эти фильтры вручную. –