在自由格式语言中,有时我使用缩进来表示我的语句中的一些隐式结构。在下面的示例中,我只是执行prints
的序列,但缩进表示第一个和第四个打印语句是"包围"两个在中间。
print("<div>")
print("hello")
print("world")
print("</div>")
有没有办法在不触发IndentationError: unexpected indent
的情况下在Python中执行类似操作?
到目前为止,我能想到的最好的方法是使用空的if
语句来引入新的缩进级别。
print("<div>")
if True:
print("hello")
print("world")
print("</div>")
答案 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可能会导致麻烦和错误(特别是涉及到逃避值时)。