Python IDLE:如何正确输入缩进?

2 投票
2 回答
1362 浏览
提问于 2025-04-18 18:19

Mac: Mavericks系统

Python: 3.4版本

我在Python的IDLE里尝试测试timeit模块。

import timeit

>>> timeit.timeit( "obj.method", """
    class SomeClass:
        def method(self):
            pass
    obj = SomeClass()
""")

当我在class SomeClass的下一行输入def method(self):时,我按了Tab键,结果弹出了一个窗口,显示了我Document目录里的文件。所以我就按了Ctrl+Tab

但是我还是遇到了错误:

Traceback (most recent call last):
  File "<pyshell#26>", line 6, in <module>
    """)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/timeit.py", line 213, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/timeit.py", line 122, in __init__
    code = compile(src, dummy_src_name, "exec")
  File "<timeit-src>", line 9
    _t0 = _timer()
             ^
IndentationError: unindent does not match any outer indentation level

有人能解释一下吗:

  1. 怎么解决这个问题,
  2. 怎么避免弹出My Document窗口?

谢谢!!!

2 个回答

0

一个很实用的技巧,可以帮助你在使用timeit时避免多行代码的问题:先定义好你的测试对象,然后从__main__中导入它。

>>> class SomeClass:
        def method(self):
                pass

>>> obj = SomeClass()

>>> timeit.timeit( "obj.method", "from __main__ import obj")
# 0.07362023352140716
1

试试这个:

>>> timeit.timeit( "obj.method", """
class SomeClass:
    def method(self):
        pass
obj = SomeClass()
""")

如果你在一个普通的 Python 模块中定义一个类,像这样多加了一个缩进:

    class Hello:
        pass

解释器会报错,提示有缩进错误。timeit 方法似乎会像处理普通的 Python 文件一样解析输入的字符串,因此也会因为类似的原因报缩进错误。注意,你的字符串在“Class”这个关键词前面多了一个(不必要的)缩进。换行是可以的。另外,空格和制表符混用也可能导致缩进错误。

我没有 Mac,所以无法重现“mydocument”这个问题,帮不了你 :(

撰写回答