Я могу сделать Apache, работающий на Windows чувствительный к регистру?

Оператор «is» Python ведет себя неожиданно с целыми числами?

blockquote>

Вкратце - позвольте мне подчеркнуть: Не используйте is для сравнения целых чисел.

Это не поведение, о котором вы должны ожидать.

Вместо этого используйте == и != для сравнения для равенства и неравенства соответственно. Например:

>>> a = 1000
>>> a == 1000       # Test integers like this,
True
>>> a != 5000       # or this!
True
>>> a is 1000       # Don't do this! - Don't use `is` to test integers!!
False

Объяснение

Чтобы это знать, вам нужно знать следующее.

Во-первых, что делает is? Это оператор сравнения. Из документации :

Операторы is и is not проверяют идентификатор объекта: x is y истинно тогда и только тогда, когда x и y являются одинаковыми объект. x is not y дает обратное значение истины.

blockquote>

И поэтому следующие эквиваленты.

>>> a is b
>>> id(a) == id(b)

Из документации :

id Вернуть «идентификатор» объекта. Это целое число (или длинное целое число), которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id().

blockquote>

Обратите внимание, что тот факт, что идентификатор объекта в CPython (эталонная реализация Python) - это местоположение в память - это деталь реализации. Другие реализации Python (например, Jython или IronPython) могут легко иметь другую реализацию для id.

Итак, каков прецедент для is? PEP8 описывает :

. Сравнение с синглонами типа None всегда должно выполняться с помощью is или is not, никогда не выполняемых операторов равенства.

Вопрос

Вы задаете и задаете следующий вопрос (с кодом):

Почему в Python происходит непредвиденное поведение?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result
blockquote>

Ожидаемый результат not . Почему это ожидалось? Это означает, что целые числа, оцененные в 256, на которые ссылаются как a, так и b, являются одним и тем же экземпляром целого числа. Целые числа неизменны в Python, поэтому они не могут измениться. Это не должно влиять на какой-либо код. Этого нельзя ожидать. Это всего лишь деталь реализации.

Но, возможно, мы должны быть рады, что каждый отдельный экземпляр в памяти не будет каждый раз, когда мы укажем, что значение равно 256.

>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?
blockquote>

Looks например, теперь у нас есть два отдельных экземпляра целых чисел со значением 257 в памяти. Поскольку целые числа неизменны, это отнимает память. Будем надеяться, что мы не будем тратить много денег. Наверное, нет. Но это поведение не гарантируется.

>>> 257 is 257
True           # Yet the literal numbers compare properly
blockquote>

Ну, похоже, что ваша конкретная реализация Python пытается быть умной и не создавать избыточно ценные целые числа в памяти, если только она не имеет к. Вы, кажется, указываете, что используете референтную реализацию Python, которая является CPython. Хорошо для CPython.

Возможно, было бы лучше, если бы CPython мог сделать это глобально, если бы он мог сделать это дешево (так как это будет стоить в поиске), возможно, другая реализация.

Но что касается влияния на код, вам все равно, является ли целое число конкретным экземпляром целого числа. Вы должны знать, что такое значение этого экземпляра, и вы использовали бы для этого обычные операторы сравнения, т. Е. ==.

Что is делает

is проверяет, что id двух объектов одинаковы. В CPython id - это место в памяти, но это может быть какое-то другое уникально идентифицирующее число в другой реализации. Чтобы переформулировать это с помощью кода:

>>> a is b

совпадает с

>>> id(a) == id(b)

Почему мы хотели бы использовать is тогда?

Это может быть очень быстрой проверкой, чтобы сказать, проверяя, являются ли две очень длинные строки равными по стоимости. Но поскольку это относится к уникальности объекта, мы, таким образом, имеем ограниченные прецеденты. Фактически, мы в основном хотим использовать его для проверки на None, который является одноэлементным (единственный экземпляр, существующий в одном месте в памяти). Мы могли бы создать другие синглтоны, если есть потенциал для их объединения, что мы можем проверить с помощью is, но они относительно редки. Вот пример (будет работать в Python 2 и 3), например

SENTINEL_SINGLETON = object() # this will only be created one time.

def foo(keyword_argument=None):
    if keyword_argument is None:
        print('no argument given to foo')
    bar()
    bar(keyword_argument)
    bar('baz')

def bar(keyword_argument=SENTINEL_SINGLETON):
    # SENTINEL_SINGLETON tells us if we were not passed anything
    # as None is a legitimate potential argument we could get.
    if keyword_argument is SENTINEL_SINGLETON:
        print('no argument given to bar')
    else:
        print('argument to bar: {0}'.format(keyword_argument))

foo()

Что печатает:

no argument given to foo
no argument given to bar
argument to bar: None
argument to bar: baz

Итак, мы видим, что с is и дозорным, мы могут различать, когда bar вызывается без аргументов и когда он вызывается с помощью None. Это первичные варианты использования для is - do not использовать его для проверки равенства целых чисел, строк, кортежей или других подобных вещей.

14
задан f3lix 3 February 2009 в 13:57
поделиться

4 ответа

Насколько я знаю, что Вы не можете, но я буду наблюдать этот вопрос за другими ответами.

Как обходное решение, Вы говорите, что необходимо разработать в Windows. Что относительно того, чтобы установить Linux в Виртуальном ПК. Существует несколько бесплатных программ VM как VirtualBox и Microsoft Virtual PC . Тем путем можно соответствовать среде разработки к среде развертывания.

Кроме того, я нахожу, что это лучше просто удостоверяться, что Вы используете нижний регистр для всего, минимизируя ошибки.

4
ответ дан 1 December 2019 в 15:22
поделиться

NTFS на самом деле делает случай поддержки чувствительные имена файлов. Это используется и включается Услугами Microsoft для UNIX. Этим управляют в реестре. Сделайте Google на ключе реестра "ObCaseinSensitive". например, блог MSDN и в особенности эта статья microsoft KB: kb817921

0
ответ дан 1 December 2019 в 15:22
поделиться

Это не проблема, можно решить способ, которым Вы хотите. Необходимо загрузить файлы путем принуждения нижнего регистра. Вы избежите проблемы конфликта имен в Windows поэтому при создании вещей в Windows затем, Вы не должны будете волноваться об этом. Теперь, необходимо использовать своего рода программу проверки ссылки для нахождения URL, которые содержат прописные буквы и затем заменяют строчным эквивалентом.

Однако Ryan Guill действительно делал хорошее предложение для включения CheckSpelling.

0
ответ дан 1 December 2019 в 15:22
поделиться

<забастовка> Это кажется Вами, может включить mod_spelling с направляющим CheckSpelling на в конфигурационном файле Apache.

информация и контекст, найденный здесь: http://bytes.com/topic/apache/answers/608164-apache-case-sensitive-urls

Редактирование: вышеупомянутое было заключено в кавычки для реверса вопроса, я сожалею. Кто-то действительно задает тот же вопрос, который Вы делаете после этого, но никогда не отвечает, если ответ работает или нет. После взгляда далее, там действительно, кажется, не флаг или любая установка в самом апаче, чтобы сделать это. Некоторые люди предлагают пытаться сделать файловую систему чувствительной к регистру, который, действительно кажется, возможен, но похоже, что это вызывает больше проблем особенно с другими программами, которые не ожидают это.

В целом, если Вы не можете разработать на другой ОС и Вы не можете пройти и изменить все свои существующие имена файлов, чтобы быть нижним регистром (который понятен), затем не похоже, что у Вас действительно есть много опций. Единственное предложение, которое я дал бы Вам в этой точке, состоит в том, чтобы попытаться получить тестовую среду, настроить точно то же как Вашу продуктивную среду и тест как можно больше прежде, чем отправить к производству.

Извините за недоразумение и что я не могу иметь большего количества справки.

0
ответ дан 1 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

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