※ 引述《ResolaQQ (ResolaQQ)》之铭言:
: 直觉的想法是在 __enter__ 的时候加个变量,执行其他函数的时候检查,像这样
: class Test(object):
: def __init__(self):
: self._with_statement = False
: def __enter__(self):
: self._with_statement = True
: def __exit__(self, type, value, traceback):
: pass
: def do_something(self):
: assert(self._with_statement)
: 如此一来,如果没用到 with statement,执行任何函数都会出错
: 但是这写法怎么看怎么蠢,也有漏写 assert 的可能
: 请问有没有比较好的写法,既可以做到使用者防呆也能做到开发者防呆?
我的想法和推文一样, 没有必要强迫使用者用 context manager
重点是文件要写好, 如果使用者爱乱搞是他家的问题
记得为什么 Python 没有 private member, 也没什么人爱用双底线 trick 吗?
We're all grown-ups here. :)
但如果你真的不想让使用者以其他方法 access 这个 class
可以考虑用 non-global definition
import contextlib
@contextlib.contextmanager
def get_something():
class Something(object):
def do_something(self):
print('do something')
print('enter')
yield Something()
print('exit')
>>> with get_something() as thing:
... thing.do_something()
...
enter
do something
exit