2013-05-07 5 views
0

Возможно ли, чтобы класс был отформатирован по-своему с помощью оператора % в Python? Меня интересует случай, когда строка формата будет примерно %3z (а не просто %s или %r, которые обрабатываются методами __str__() и __repr__()). Сказано иначе: Python 2.6+ позволяет классам определять метод __format__(): существует ли эквивалент для оператора %?Можно ли выполнить произвольное форматирование с помощью оператора% в Python?

Я попытался определить метод __rmod()__, в надежде, что str.__mod__() вернется NotImplemented и __rmod()__ будет называться, но "%3z" % … возвращает ValueError: unsupported format character 'z' вместо ...

+1

Я уверен, что этого не может быть сделано. Есть ли причина, по которой вы избегаете использования формата? – mgilson

+0

Существует причина: форматирование будет применяться к числам с неопределенностью моего пакета неопределенностей, который работает со всей версией Python *, начиная с 2.3 * (версии с 2.3 по 2.5 имеют только '%', а не 'format()'). – EOL

ответ

2

Там ISN «т. Эта настраиваемость является одним из основных преимуществ метода format по сравнению с % форматированием. Если бы это было не ново, PEP 3101 не нужно было подробно обсуждать этот аспект этого.

Если вам нужна поддержка более старых версий Python, чем у нового стиля форматирования строк, то лучшее, что вы можете сделать, это реализовать пользовательскую функцию преобразования в классе, и ожидать, что клиенты называют это так:

'%4f %s' % (5, myobj.str('<')) 
-1

Вы могли бы найти это полезным: operator overloading in python

__mod__ и __rmod__ включены здесь: http://docs.python.org/2/reference/datamodel.html#emulating-numeric-types

Не беспокойтесь, пытаясь изобретать Python «S строка форматирования мини-язык ... использовать его в своих интересах: http://docs.python.org/2/library/string.html#format-specification-mini-language

EDIT: Вы, вероятно, получили по крайней мере, это далеко, но так как мы здесь, чтобы код:

class moddableObject(object): 
    def __mod__(self, arg) 
     return 'got format arg: {}'.format(arg) 

moddable = moddableObject() 
print moddable % 'some string' 
+1

OP явно уже знает, как работает перегрузка операторов - он специально попытался внедрить 'moddableObject .__ rmod__', чтобы найти, что' 'некоторая строка '% moddable' не вызывает его (поскольку' str .__ mod__' вызывает исключение, а не возвращает ' NotImplemented'). – lvc

+0

, следовательно, мой комментарий: «вы, вероятно, получили по крайней мере это далеко, но так как мы здесь, чтобы закодировать» ... Я положил его туда, чтобы другие могли видеть быстрый пример (и поэтому я мог попробовать это сам). – mdscruggs

Смежные вопросы