Запись всего XML-документа в String с использованием HXT [duplicate]

Такое поведение неудивительно, если принять во внимание следующее:

  1. Поведение атрибутов класса только для чтения при попытках назначения и что
  2. Функции являются объектами (хорошо объясняется в принятом ответе).

Роль (2) была широко освещена в этой теме. (1), вероятно, является фактором, вызывающим удивление, поскольку это поведение не является «интуитивным» при поступлении с других языков.

(1) описано в учебнике Python по классам . При попытке присвоить значение атрибуту класса только для чтения:

... все переменные, найденные вне самой внутренней области, доступны только для чтения ( попытка написать такую переменная просто создаст новую локальную переменную в самой внутренней области, оставив неизмененную идентичную внешнюю переменную неизменной ).

Оглянитесь на исходный пример и рассмотрите приведенные выше пункты:

def foo(a=[]):
    a.append(5)
    return a

Здесь foo - объект, а a - атрибут foo (доступен в foo.func_defs[0]). Поскольку a является списком, a является изменяемым и, таким образом, является атрибутом чтения-записи foo. Он инициализируется пустым списком, указанным сигнатурой при создании экземпляра функции, и доступен для чтения и записи до тех пор, пока существует функциональный объект.

Вызов foo без переопределения значения по умолчанию использует значение по умолчанию от foo.func_defs. В этом случае foo.func_defs[0] используется для a в пределах области кода объекта объекта. Изменения в a меняют foo.func_defs[0], который является частью объекта foo и сохраняется между выполнением кода в foo.

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

def foo(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

Принимая во внимание (1) и (2) , можно понять, почему это выполняет желаемое поведение:

  • Когда объект функции foo создается, foo.func_defs[0] установлен на None, неизменяемый объект.
  • Когда функция выполняется с настройками по умолчанию (без функции, заданной для L в вызове функции), foo.func_defs[0] (None) доступен в локальной области как L.
  • После L = [] присваивание не может преуспеть в foo.func_defs[0], поскольку этот атрибут доступен только для чтения.
  • Per (1), новая локальная переменная с именем L создается в локальной области и используется для остальной части вызова функции. foo.func_defs[0], таким образом, остается неизменным для будущих вызовов foo.

5
задан jgre 26 August 2011 в 18:42
поделиться

1 ответ

Если вы посмотрите на XmlTree s для обоих, вы увидите, что readString добавляет элемент верхнего уровня "/". Для версии IO runLA:

> putStr . formatTree show . head $ runLA xread html
---XTag "html" []
   |
   +---XText "\n  "
   |
   +---XTag "head" []
   ...

И с runX:

> putStr . formatTree show . head =<< runX (readString [] html)
---XTag "/" [NTree (XAttr "transfer-Status") [NTree (XText "200")...
   |
   +---XTag "html" []
       |
       +---XText "\n  "
       |
       +---XTag "head" []
       ...

writeDocumentToString использует getChildren для удаления этого корня element.

. Один простой способ - использовать что-то вроде selem, чтобы обернуть вывод xread в подобный корневой элемент, чтобы он выглядел как вид ввода writeDocumentToString ожидает:

> runLA (selem "/" [xread] >>> writeDocumentToString [withOutputHTML, withIndent yes]) html
["<html>\n  <head>\n    <title>Bogus</title>\n  </head>\n  <body>\n        Some trivial bogus text.\n    </body>\n</html>\n"]

Это дает желаемый результат.

6
ответ дан Travis Brown 21 August 2018 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: