Re: [問題] 如何強制使用 with statement

作者: uranusjr (←這人是超級笨蛋)   2015-12-21 23:02:55
※ 引述《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
作者: akasan (KITO)   2014-11-02 00:43:00
valgrind, 但 windowns 版的沒試過XDlinux 上那真的是不二選擇了
作者: Linux (Windows)   2014-11-02 00:45:00
我是用 Windows ....>"<
作者: ResolaQQ (ResolaQQ)   2015-12-22 00:17:00
挺有道理,我好像把事情弄的太複雜了

Links booklink

Contact Us: admin [ a t ] ucptt.com