Unexpected indentation error, but indentation look

2019-06-27 14:35发布

问题:

I have been trying to run this code and it throws an indent error. No matter what I try, the result is the same.

If I delete the indent before def __str__(self): and the rest of the code, it works fine, but on output, instead of displaying the question, it shows 'Question object'.

def __str__(self):
^
IndentationError: unexpected indent

Here is the code:

from __future__ import unicode_literals
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

回答1:

I guess you are mixing spaces and tabs ....

You can indent the code using autopep

please see https://pypi.python.org/pypi/autopep8



回答2:

You are mixing spaces and tabs. Assuming the code in your post is using the same indent characters that you're using in reality, here is how your code actually indents, with >--- representing one tab, and . representing one space.

from __future__ import unicode_literals
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils import timezone

class Question(models.Model):
....question_text = models.CharField(max_length=200)
....pub_date = models.DateTimeField('date published')

>---def __str__(self):
....>---return self.question_text

....def was_published_recently(self):
>---....return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
....question = models.ForeignKey(Question, on_delete=models.CASCADE) 
....choice_text = models.CharField(max_length=200)
....votes = models.IntegerField(default=0)

>---def __str__(self):
....>---return self.choice_text

As you can see, your indentation is not consistent. When defining both instances of __str__(), your existing indent level is 4 spaces, but the function definition is indented with 1 tab. That results in the error.

By convention, Python code should only be indented using spaces, never tabs, for exactly this reason.

See also PEP 8, specifically the sections "Indentation" and "Tabs or Spaces?"