轨道
/
Python
Python
/
练习
/
银行账户
银行账户

银行账户

中等

简介

填了多年的表格、等了多年之后,你终于拿到了银行牌照。这意味着你正式有资格开一家自己的银行了,太好了!

你的首要任务是让 IT 系统跑起来。经过一天的辛苦工作,你已经能开户、销户,还能处理取款和存款了。

你懒得写测试,于是请了几个朋友来帮忙测试系统。可是才过了五分钟,就有个朋友说自己丢钱了!你虽然确信自己的代码没有 bug,还是开始翻日志,想查个究竟。

啊哈,果然如你所料,问题出在你朋友身上!他把自己的测试凭据分享给了另一个朋友,两人合谋对同一个账户_并行_地存取款。谁会干这种事?

你争辩说,一个人物理上_不可能_并行访问自己的账户,朋友却得意地告诉你,银行规则_要求_你必须支持这种操作。所以,不支持并行银行操作,就拿不到上线许可。你叹了口气,默默记下明天要处理这件事。这会让你的上线日期_至少_再推迟一天,不过嘛……

说明

你的任务是实现银行账户,支持开立、关闭、取款和存款。

由于银行账户可以通过多种方式访问(互联网、手机、自动扣款),你的银行软件必须允许从多个线程/进程(具体术语取决于你的编程语言)并行、安全地访问账户。 例如,可能有许多存款和取款同时发生,你需要确保在读取账户余额和设置新余额之间不存在竞态条件。

账户应当可以关闭;针对已关闭账户的操作必须失败。

Note

Python 由于全局解释器锁,并不支持“真正的”并发。 虽然为 Python 自由线程 开发支持的工作正在进行中,但它目前仍处于实验阶段。 而 multiprocessing 和 threading 这类标准库方案,用当前的 track 工具很难实现。

因此,本练习暂时搁置了并发要求。 账户操作在单线程上依次进行,也不会运行并发或“竞态条件”相关的测试。

如果你想尝试自由线程或并发测试,请在本地进行。 如需了解如何在本地下载和完成练习,我们推荐使用 Exercism CLI。


异常消息

有时需要抛出异常。这样做时,应始终包含一条有意义的错误消息,说明错误的来源。这能让代码更易读,也对调试大有帮助。如果你知道错误来源属于某种特定类型,可以选择抛出某个内置错误类型,但仍应包含一条有意义的说明。

本练习要求你使用 raise 语句,在账户已打开或未打开,或者取款或存款金额不正确时“抛出” ValueError。只有同时 raise 该 exception 并附上消息,测试才会通过。

要为 ValueError 附上消息,请把消息作为实参传给 exception 类型:

# account is not open
raise ValueError('account not open')

# account is already open
raise ValueError('account already open')

# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')

# withdrawal is too big
raise ValueError('amount must be less than balance')
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Python Exercism

准备好开始 银行账户 了吗?

注册 Exercism,借助 17 个概念146 个练习 和真人导师指导,学习并掌握 Python,全部免费。