Переустановка lxml из pkgs / main channel из репозитория anaconda позволяет решить проблему:
conda install lxml
Будут обновлены следующие пакеты:
libxml2 conda-forge :: libxml2- 2.9.8-h9ce36c8_1 ~ -> pkgs / main :: libxm l2-2.9.9-h464c3ec_0 libxslt
conda-forge :: libxslt-1.1.32-heafd4d3_ ~ -> pkgs / main :: libxs lt-1.1.33-h579f668_0Следующие пакеты будут заменены на канал с более высоким приоритетом: ... lxml
BLOCKQUOTE>
conda-forge :: lxml-4.3.2-py37heafd4d3_0 - -> pkgs / main :: lxml- 4.3.2-py37h1350720_0 ...
Небольшое уточнение. На самом деле они являются статическими значениями только для чтения, а не константами. Это имеет определенную разницу в .Net, потому что константные значения встроены различными компиляторами, и, следовательно, невозможно отследить их использование в скомпилированной сборке. Статические значения только для чтения, однако, не копируются, а вместо этого ссылаются. Это полезно для вашего вопроса, потому что это означает, что их использование может быть проанализировано.
Если вы используете рефлектор и копаете BCL, вы заметите, что MinusOne и Zero используются только во время выполнения VB. Он существует главным образом для обслуживания преобразований между десятичными и логическими значениями. Почему MinusOne по совпадению появился сегодня в отдельном потоке ( ссылка )
Как ни странно, если вы посмотрите на значение Decimal.One, которое вы ' Заметьте, это используется нигде.
Относительно того, почему они явно определены ... Я сомневаюсь, что есть веская и быстрая причина. Там , по-видимому, не имеет конкретной производительности, и лишь немного удобной меры, которую можно отнести к их существованию. Мое предположение состоит в том, что они были добавлены кем-то во время разработки BCL для их удобства и просто никогда не удалялись.
РЕДАКТИРОВАТЬ
Вскочил в const
вопрос немного больше после комментария @Paleta. Определение C # для Decimal.One
использует модификатор const
, однако он генерируется как статический только для чтения
на уровне IL. Компилятор C # использует несколько приемов, чтобы сделать это значение практически неотличимым от const
(например, встроенных литералов). Это будет отображаться на языке, который распознает этот трюк (VB.Net распознает это, но F # нет).
Некоторые языки .NET не поддерживают десятичный тип данных, и в этих случаях он удобнее (и быстрее) записать Decimal.ONE вместо нового Decimal (1).
Класс Java BigInteger имеет также ZERO и ONE, по той же причине.
Мое мнение о том, что они существуют, чтобы помочь избежать магических чисел.
Магические числа в основном в любом месте вашего кода, где у вас есть число aribtrary. Например:
int i = 32;
Это проблематично в том смысле, что никто не может сказать , почему мне присвоено значение 32, или что означает 32, или вообще должно быть 32. Это волшебно и таинственно.
В том же духе, я часто вижу код, который делает это
int i = 0;
int z = -1;
Почему они устанавливаются в 0 и -1? Это просто совпадение? Они что-то значат? Кто знает?
Хотя Decimal.One
, Decimal.Zero
и т. Д. Не говорят вам, что значения означают в контексте вашего приложения (возможно, ноль означает «отсутствует») , так далее),
Это не для оптимизации. Обратите внимание на код C #:
public static Decimal d = 0M;
public static Decimal dZero = Decimal.Zero;
При просмотре сгенерированного байт-кода с использованием ildasm обе опции приводят к идентичным MSIL. System.Decimal
является типом значения, поэтому Decimal.Zero
не более «оптимален», чем просто использование литерального значения.
Эти 3 значения arghhh !!!
Я думаю, они могут иметь какое-то отношение к тому, что я называю конечными единицами
, скажем, у вас есть такая формула:
(x) 1,116666 + (y) = (z) 2,00000
, но x , z округляются до 0,11 и 2,00 , и вам будет предложено вычислить (y).
, поэтому вы можете подумать y = 2,00 - 1,11
. Фактически y равно 0,88 , но вы получите 0,89 . (разница составляет 0,01 ).
В зависимости от реального значения x и y результаты будут варьироваться от -0,01 до +0,01 , а в некоторых случаях при работе с несколькими замыкающими единицами и для упрощения работы вы можете проверить, равно ли конечное значение Decimal.MinusOne / 100
, Decimal.One / 100
или Decimal.Zero / 100
, чтобы исправить их.
вот как я их использовал.