По вопросу «что мне делать с этим» может быть много ответов.
Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и . Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы. Таким образом, вы можете избежать случаев Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий: По этой причине Код Контракт существует для приложений .NET. В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений . ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля . NullReferenceException
, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X
в классе, а затем попытаетесь вызвать один из его методов, а X
имеет нулевое значение, то это приведет к NullReferenceException
: public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
Убедитесь, что вы используете опцию «вставить пробелы вместо вкладок» в свой редактор. Затем вы можете выбрать нужную ширину табуляции, например 4. Вы можете найти эти параметры в gedit в редакторе -> предпочтения -> редактор.
нижняя строка: USE SPACES не вкладки
Python использует интервал в начале строки, чтобы определить, когда начинаются и заканчиваются блоки кода. Ошибки, которые вы можете получить, следующие:
Неожиданный отступ. Эта строка кода имеет больше пробелов в начале, чем предыдущая, но первая из них не является началом субблока (например, если / while / for statement). Все строки кода в блоке должны начинаться с точно такой же строки пробелов. Например:
>>> def a():
... print "foo"
... print "bar"
IndentationError: unexpected indent
Это особенно часто встречается при запуске python в интерактивном режиме: убедитесь, что вы не добавляете лишних пробелов перед вашими командами. (Очень раздражает код примера копирования и вставки!) [/ G3]
>>> print "hello"
IndentationError: unexpected indent
Unindent не соответствует внешнему уровню отступа. Эта строка кода имеет меньше пробелов в начале, чем предыдущая, но в равной степени она не соответствует ни одному другому блоку, в котором она может быть частью. Python не может решить, куда он идет. Например, в следующем ли окончательный отпечаток должен быть частью предложения if, или нет?
>>> if user == "Joey":
... print "Super secret powers enabled!"
... print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level
Ожидаемый отложенный блок. Эта строка кода имеет такое же количество пробелов в начале, как и раньше, но ожидалось, что последняя строка запустит блок (например, if / while / for statement, определение функции).
>>> def foo():
... print "Bar"
IndentationError: expected an indented block
Если вам нужна функция, которая ничего не делает, используйте команду «no-op» pass :
>>> def foo():
... pass
Разрешены смешения вкладок и пробелов (по крайней мере, на моя версия Python), но Python предполагает, что вкладки имеют длину 8 символов, что может не соответствовать вашему редактору. Просто скажите «нет» вкладкам. Большинство редакторов позволяют автоматически их заменять пробелами.
Лучший способ избежать этих проблем - всегда использовать согласованное количество пробелов, когда вы отступаете подблоком, и в идеале используйте хорошую среду IDE, которая решает проблему для тебя. Это также сделает ваш код более удобочитаемым.
Все, что вам нужно сделать, это удалить пробелы или области табуляции с начала следующих кодов
from django.contrib import admin
# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
Используя правильный отступ. Python - это пробел, поэтому вам нужно следовать его указаниям отступов для блоков или вы получите ошибки отступов.
Notepad ++ дал поле вкладки правильно, но проблема с отступом была наконец найдена в текстовом редакторе Sublime.
Использовать Sublime текстовый редактор и идти по строкам
Включите видимые пробелы в любом редакторе, который вы используете, и включите замену вкладок пробелами.
Хотя вы можете использовать вкладки с вкладками микширования Python, а пространство обычно приводит к ошибке, которую вы испытываете. Замена вкладок на 4 пробела - рекомендуемый подход для написания кода Python.
Есть трюк, который всегда работал для меня:
Если у вас есть и неожиданный отступ, и вы видите, что весь код отлично отступом, попробуйте открыть его другим редактором, и вы увидите, какая строка Код не отступы.
Это случилось со мной, когда вы использовали vim, gedit или редакторы.
Попробуйте использовать только 1 редактор для вашего кода.
Запустите код с параметром -tt, чтобы узнать, используете ли вы вкладки и пробелы непоследовательно
Просто скопируйте свой скрипт и поставьте под "" "весь ваш код" "" ...
укажите эту строку в переменной .. like,
a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..
now выполните этот код, в Sublime Editor, используя ctrl + b, теперь он будет печатать отступы в консоли. вот он
Если вы пишете Python с использованием Sublime и получаете ошибки отступов,
view -> indentation -> преобразуйте отступ в пробелы
Проблема, которую я описываю, вызвана Возвышенный текстовый редактор. Та же проблема может быть вызвана и другими редакторами. По сути, проблема связана с тем, что Python хочет обрабатывать отступы в терминах пробелов и разных редакторов, кодирующих отступы в терминах вкладок.
Если отступы выглядят нормально, посмотрите, есть ли у вашего редактора опция «View Whitespace». Включение этого параметра должно позволять находить места, где смешиваются пробелы и вкладки.
Одна проблема, которая, как представляется, не упоминалась, заключается в том, что эта ошибка может возникнуть из-за проблемы с кодом, который не имеет никакого отношения к отступу.
Например, возьмите следующий скрипт :
def add_one(x):
try:
return x + 1
add_one(5)
Это возвращает IndentationError: unexpected unindent
, когда проблема, конечно, является отсутствующим оператором except:
.
Моя точка: проверьте код выше, где неожиданное (un) отступ сообщается!
В Python интервал очень важен, это дает структуру ваших блоков кода. Эта ошибка возникает, когда вы испортите структуру кода, например, следующим образом:
def test_function() :
if 5 > 3 :
print "hello"
В вашем файле также может быть сочетание вкладок и пробелов.
Я предлагаю вам используйте редактор, поддерживающий синтаксис python, например PyScripter или Netbeans
Эта ошибка также может возникать при вставке чего-либо в интерпретатор Python (терминал / консоль).
Обратите внимание, что интерпретатор интерпретирует пустую строку как конец выражения, поэтому, если вы вставляете что-то вроде
def my_function():
x = 3
y = 7
, интерпретатор будет интерпретировать пустую строку до y = 7
как конец выражения, т. е. что вы закончили определение своей функции, а следующая строка - y = 7
будет иметь неправильный отступ, потому что это новое выражение.