SilentGhost: dis.dis
действительно демонстрирует базовую концептуальную / исполнительную сложность. В конце концов, ФП пожаловался на то, что оригинальная цепь замены была слишком «неуклюжей», но не слишком «медленной».
я рекомендую не использовать регулярные выражения там, где это не является неизбежным; в противном случае они просто добавляют концептуальные накладные расходы и снижение скорости. использовать translate()
здесь, ИМХО, просто неправильный инструмент, и нигде не так концептуально просто и универсально, как оригинальная цепочка замены.
так что вы говорите тамайто, а я говорю томахто: оригинальное решение довольно хорошо с точки зрения ясности и универсальности. это совсем не коряво. чтобы сделать его немного более плотным и более параметризованным, рассмотрите возможность его изменения на
phone_nr_translations = [
( ' ', '', ),
( '(', '', ),
( ')', '', ), ]
def sanitize_phone_nr( phone_nr ):
R = phone_nr
for probe, replacement in phone_nr_translations:
R = R.replace( probe, replacement )
return R
в этом специальном приложении, конечно, вы действительно хотите просто удалить любые нежелательные символы, так что вы можете упростить это:
probes = ' ()'
def sanitize_phone_nr( phone_nr ):
R = phone_nr
for probe in probes:
R = R.replace( probe, '' )
return R
Если подумать, мне не совсем понятно, почему вы хотите превратить номер телефона в целое число - это просто неправильный тип данных. это может быть продемонстрировано тем фактом, что, по крайней мере, в мобильных сетях +
и #
и, возможно, больше являются допустимыми символами в строке набора (dial, string - видите?).
но кроме этого, дезинфекция телефонного номера пользователя, чтобы получить нормализованное и безопасное представление, является очень и очень серьезной проблемой - только я чувствую, что ваша методология слишком конкретна. почему бы не переписать метод очистки на что-то очень общее, не становясь более сложным? в конце концов, как вы можете быть уверены, что ваши пользователи никогда не будут вводить другие девиантные символы в это поле веб-формы?
так что вы на самом деле хотите не dis - мелкие специфические символы (в юникоде 5.1 определено около ста тысяч определенных кодовых точек, так как их догнать?), Но разрешить те самые символы, которые считаются допустимыми в строках набора. и вы можете сделать это с помощью регулярного выражения ...
from re import compile as _new_regex
illegal_phone_nr_chrs_re = _new_regex( r"[^0-9#+]" )
def sanitize_phone_nr( phone_nr ):
return illegal_phone_nr_chrs_re.sub( '', phone_nr )
... или с набором:
legal_phone_nr_chrs = set( '0123456789#+' )
def sanitize_phone_nr( phone_nr ):
return ''.join(
chr for chr in phone_nr
if chr in legal_phone_nr_chrs )
эта последняя строфа вполне может быть записана в одну строку. недостаток этого решения состоит в том, что вы перебираете входные символы из Python, не используя потенциальный обход C-спидера, предложенный str.replace()
или даже регулярным выражением. тем не менее, производительность в любом случае будет зависеть от ожидаемой схемы использования (я уверен, что вы сначала усекаете свои номера телефонов, верно? так что это будет много небольших строк для обработки, а не несколько больших).
обратите внимание на несколько моментов: я стремлюсь к ясности, поэтому стараюсь избегать чрезмерного использования сокращений. chr
для character
, nr
для number
и R
для возвращаемого значения (скорее всего, тьфу, retval
, где используется в стандартной библиотеке) находятся в моей книге стилей. программирование - это то, что нужно понимать и делать, а не программисты, пишущие код, который приближается к пространственной эффективности gzip. теперь посмотрите, последнее решение делает довольно многое из того, что удалось сделать ОП (и даже больше), в ...
legal_phone_nr_chrs = set( '0123456789#+' )
def sanitize_phone_nr( phone_nr ): return ''.join( chr for chr in phone_nr if chr in legal_phone_nr_chrs )
... две строки кода, если необходимо, тогда как код ОП ...
class Phone():
def __init__ ( self, input ): self.phone = self._sanitize( input )
def __str__ ( self ): return self.phone
def _sanitize ( self, input ): return input.replace( ' ', '' ).replace( '(', '' ).replace( ')', '' )
... вряд ли можно сжать ниже четырех строк. Посмотрите, какой дополнительный багаж дает вам решение строго ООП? я верю, что это может быть оставлено вне изображения большую часть времени.