我可以故意写作"错误缩进" Python代码?

时间:2016-02-12 07:10:20

标签: python

在自由格式语言中,有时我使用缩进来表示我的语句中的一些隐式结构。在下面的示例中,我只是执行prints的序列,但缩进表示第一个和第四个打印语句是"包围"两个在中间。

print("<div>")
  print("hello")
  print("world")
print("</div>")

有没有办法在不触发IndentationError: unexpected indent的情况下在Python中执行类似操作?

到目前为止,我能想到的最好的方法是使用空的if语句来引入新的缩进级别。

print("<div>")
if True:
  print("hello")
  print("world")
print("</div>")

2 个答案:

答案 0 :(得分:6)

我也记得有时想要这样的结构。这就是我想到的(在C代码中允许这种错误缩进):

glBegin(GL_TRIANGLES);
    drawVertices();
glEnd();

请注意,我们有一个begin和一个end,从这里我可以假设您的情况也是如此:您想要表示开头和结尾一些东西。另一种情况是打开和关闭文件,甚至是问题中的示例。 Python有一个特定的功能:context managers。 Python的文档甚至还有一个example

  

(建议不要将其作为生成HTML的真实方式!):

from contextlib import contextmanager

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("</%s>" % name)

>>> with tag("h1"):
...    print("foo")
...
<h1>
foo
</h1>

我必须提到,上下文管理器不仅仅是一种重构代码的方法,它们实际上可以对从封闭代码引发的异常起作用,并且无论异常如何都执行一些代码(例如,确保文件关闭了)。使用@contextmanager的简单示例不会发生这种情况,因为它的默认行为是简单地重新引发异常,因此不会发生任何意外。

除此之外,与您合作的人不会对虚假缩进感到高兴。如果您坚持,请确保if True是一个选项。

答案 1 :(得分:4)

一般来说,不,缩进在Python中很重要。

您可以使用的一些替代方法是注释和行间距:

Document document = new Document(new Rectangle(300, 125));
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
document.add(new Paragraph("Table with setSplitLate(true):"));
PdfPTable table = new PdfPTable(2);
table.setWidths(new float[]{1,5});
table.setSpacingBefore(10);
PdfPCell cell = new PdfPCell();
cell.addElement(new Paragraph("G"));
cell.addElement(new Paragraph("R"));
cell.addElement(new Paragraph("O"));
cell.addElement(new Paragraph("U"));
cell.addElement(new Paragraph("P"));

//PdfPCell cell = new PdfPCell( new Phrase("GROUP"));
//cell.setNoWrap(true);
//cell.setRotation(90);
//cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//cell.setHorizontalAlignment(Element.ALIGN_CENTER);

cell.setRowspan(5);
table.addCell(cell);
table.addCell("row 1");
table.addCell("row 2");
table.addCell("row 3");
table.addCell("row 4");
table.addCell("row 5");
document.add(table);
document.add(new Paragraph("Table with setSplitLate(false):"));
table.setSplitLate(false);
document.add(table);
document.close();

print("start")

print("middle1")
print("middle2")

print("end")

如果有意义的话,您还可以考虑将代码分解为子函数。

# Header
print("start")
# Middle
print("middle1")
print("middle2")
# End
print("end")

但是,对于生成嵌套输出(如HTML)的特定用例,我建议使用模板库;通过字符串操作编写原始HTML可能会导致麻烦和错误(特别是涉及到逃避值时)。