Sub-class float type в Python, не удается поймать исключение в __init __ ()

На Python 2.5 мне нужно использовать числа с плавающей запятой с измененным __str__() . Также мне нужно знать, когда сработает конструктор.

Почему я не могу поймать исключения, полученные из float.__init__() ?

  • Регистрация запрещенных исключений в Python
  • Почему Python не выходит из повышенного исключения при выполнении с абсолютным путем?
  • Дешевая обработка исключений в Python?
  • Обработка произвольного исключения, печать сообщения об исключении по умолчанию
  • Повысить исключение против возврата Нет в функциях Python
  • Как распечатать полную трассировку без остановки программы?
  • Каков наилучший способ проконсультироваться с числовым значением моего производного объекта float? В моем коде я использую float(self) .

     class My_Number(float): def __init__(self, float_string): try: super(My_Number, self).__init__(float_string) except (TypeError, ValueError): raise My_Error(float_string) def __str__(self): if int(float(self)) == float(self): return str(int(float(self))) else: return str(round(float(self), 2)) >>> n = My_Number('0.54353') >>> print n 0.54 >>> n = My_Number('5.0') >>> print n 5 >>> n = My_Number('foo') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for float(): foo 

  • Сохранить / выгрузить файл YAML с комментариями в PyYAML
  • Выделение непревзойденных скобок в vim
  • как получить все возможное сочетание элементов из 2-мерного списка в python?
  • Как использовать groupby для конкатенации строк в python pandas?
  • Разбор JS с красивым супом
  • Python не может получить форму с urllib или механизировать
  • 2 Solutions collect form web for “Sub-class float type в Python, не удается поймать исключение в __init __ ()”

    float неизменен, поэтому его __init__ , инициализатор , в основном, не работает – ничего существенного там не может произойти, потому что self объект не может быть изменен (если это фактически экземпляр float а не подкласса, но, конечно, Собственный __init__ должен работать на этом предположении ;-).

    Поэтому все действия происходят в __new__ , самом конструкторе , как и для других неизменяемых типов, таких как int , str , tuple и т. Д. Ошибочно полагать, что __init__ является конструктором: это не так, он принимает уже построенный объект как свой первый аргумент, self и «инициализирует» его (если это возможно, т. Е. Если это self изменяемо!) – сама конструкция происходит в __new__ .

    Итак, ваш float подкласс должен начинаться:

     class My_Number(float): def __new__(cls, float_string): try: return float.__new__(cls, float_string) except (TypeError, ValueError): raise My_Error(float_string) 

    и вы можете удалить __init__ , который не нужен. Теперь:

     >>> n = My_Number('foo') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in __new__ NameError: global name 'My_Error' is not defined 

    (конечно, это будет работать еще лучше, если у вас определен My_Error исключения My_Error ;-).

    попробуйте вместо __new__ :

     class F(float): def __new__(cls, *arg, **kw): try: return float.__new__(cls, *arg, **kw) except ValueError: raise Exception("foo") print F("3.5") print F("asdf") 

    Также «я» – это поплавок, так что не нужно говорить «плавать» («я»), просто «я» будет делать:

     def __str__(self): return "%.2f" % self 
    Python - лучший язык программирования в мире.