想办法清理我的代码。
在我的Python代码中有这样的代码:
company = None
country = None
person = Person.find(id=12345)
if person is not None: # found
company = Company.find(person.companyId)
if company is not None:
country = Country.find(company.countryId)
return (person, company, country)
在读过一个关于Haskell单子的教程(特别是 Maybe)之后,我想知道是否有可能用另一种方式来写它。
8条答案
按热度按时间vq8itlhq1#
EAFP
tyg4sfes2#
利用短路行为以及自定义对象默认为true而
None
为false:dced5bon3#
Python没有特别好的单子语法,也就是说,如果你想限制自己使用像
Maybe
这样的单子(意思是你只能使用Maybe
;你将不能创建处理任何单子的泛型函数),你可以使用下面的方法:然后,让所有当前返回
None
的方法返回Just(value)
或Nothing
,这样就可以编写以下代码:当然,您可以修改lambda以将中间结果存储在变量中;如何正确地做这件事取决于你。
toiithl64#
你查过PyMonad了吗?
https://pypi.python.org/pypi/PyMonad/
它不仅包括一个可能单子,而且还包括一个列表单子,一个函子和应用函子类。
在您的情况下,它可能是这样的:
比EAFP更容易理解和清洁。
goucqfw65#
我认为这是
getattr(object, name[, default])
的完美情况:kqlmhetl6#
whitzsjs7#
比试图实现一个不同的范式(不是说它不有趣和不酷)更“Python”的是给你的对象添加智能,这样它们就可以自己找到它们的属性(以及它们是否存在)。
Bellow是一个基类的示例,它使用“find”方法以及Id属性名和类名的相关性来处理您的示例--我放入了最小的Person和Company类,以便搜索公司:
在控制台上,粘贴上面的代码后:
有了这个
Base
,上面的代码就可以是:r6l8ljro8#
haskell
的也许python
中的模拟是打字,可选的,但可悲的是,这不是一回事。有关详细信息,请参见
https://docs.python.org/3/library/typing.html#typing.Optional
How should I use the Optional type hint?
使用
typing.Optional
构建链可以是这样的: