Dom4j является простым API для создания xml документы в Java.
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Toby" )
.addAttribute( "location", "Germany" )
.addText( "Tobias Rademacher" );
Я вижу, что кто-то другой уже указал на мой старый рецепт «Назначить и установить» Поваренной книги, который в своей простейшей версии сводится к следующему:
class Holder(object):
def set(self, value):
self.value = value
return value
def get(self):
return self.value
h = Holder()
...
if h.set(isBig(y)): return h.get()
Однако это было предназначено в основном для облегчения транслитерации между Python и языки, в которых присвоение напрямую поддерживается в if
или while
. Если у вас есть «сотни» таких проверок и возвратов в каскаде, намного лучше сделать что-то совершенно другое:
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
или даже что-то вроде
return next(x for x in (f(y) for f in hundreds) if x)
, если можно получить исключение StopIteration если ни один предикат не удовлетворен, или
return next((x for x in (f(y) for f in hundreds) if x)), None)
if None
- правильное возвращаемое значение, когда ни один предикат не удовлетворен, и т. д.
Почти всегда, используя (или даже желая ;-) Уловка / не-идиома Холдера
- это "запах дизайна"
Если вы хотите писать код на PHP (или C), пишите на нем. Не пытайтесь навязать его методы на другом языке.
Один из основных принципов Python (на мой взгляд) - его удобочитаемость. Вы должны использовать:
fruit = isBig(y)
if fruit: return fruit
Я также должен упомянуть, что использование вами isXXX ()
очень странно; обычно используется для возврата логических значений. Особенно в этом случае, когда вы используете его в операторе IF
.
Один лайнер не работает, потому что в Python присваивание ( fruit = isBig (y)
) является оператором, а не выражением. В C, C ++, Perl и бесчисленном множестве других языков это выражение, и вы можете поместить его в if
или while
или что угодно, но не в Python, потому что создатели Python считали, что им слишком легко злоупотреблять (или злоупотреблять), чтобы писать «умный» код (как вы пытаетесь это сделать).
Кроме того, ваш пример довольно глупый. isBig ()
всегда будет оценивать как true
, поскольку единственная ложная строка - это пустая строка ( ""
), поэтому ваш if
в этом случае бесполезен. Я предполагаю, что это просто упрощение того, что вы пытаетесь сделать. Просто сделай это:
Это не работает из-за намеренного языкового дизайна, но вы можете использовать этот трюк , чтобы обойти это решение
Проблема в том, что операция присваивания не может быть оценена как имеющая логическое значение. Оператор if
полагается на возможность оценивать логическое значение. Например,
>>> fruit = 'apple'
>>> bool(fruit = 'apple')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Users/jem/<ipython console> in <module>()
TypeError: 'fruit' is an invalid keyword argument for this function
>>> bool('a')
True