所以我有一长串条件应该被验证为真。我没有链接很长的 if
条件,而是尝试“创新”并以这种方式进行,我认为这种方式更具可读性。但我的问题是,这是这样做的最佳方式吗?
或者是否有一种 pythonic 的方式来做到这一点? PS:请用替代方案回复而不是回答“否”,谢谢!
这是代码块:
def site_exists(site):
"""
returns the sitebean if it exists,
else returns false
"""
vpadmin_service = _get_vpadmin_service(site)
all_sites = VpAdminServiceUtil.getSites(vpadmin_service)
for site_listing in all_sites:
if site.getId():
#condition check
try:
assert site.getId() == site_listing.getId()
assert site.getName() == site_listing.getName()
assert site.getCustomer().getId() == site_listing.getCustomer().getId()
except AssertionError:
continue
#pass conditions
return site_listing
#no id, so just check for name and customer
else:
#condition check
try:
assert site.getName() == site_listing.getName()
assert site.getCustomer().getId() == site_listing.getCustomer().getId()
except AssertionError:
continue
#pass conditions
site.setId(site_listing.getId())
return site_listing
return False
最佳答案
一种更简单的方法是构建条件元组并比较元组:
def site_info(s):
return s.getId(), s.getName(), s.getCustomer().getId()
if site_info(site) == site_info(site_listing):
return site_listing
else:
continue
如果您有很多条件,或者条件很昂贵,您可以改为为条件创建一个生成器,并与any
或all
进行比较:
import itertools
def iter_site_info(s):
yield s.getId()
yield s.getName()
yield s.getCustomer().getId()
if all(x==y for (x, y) in itertools.izip(iter_site_info(site), iter_site_info(site_listing)):
return site_listing
else:
continue
我不确定 Jython 是否有 any
和 all
,但它们是可以编写的微不足道的函数。
编辑 - any
和 all
出现在 Python 2.5 中,所以 Jython 应该有它们。
关于python - 在 Python 中验证长链条件的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431613/