python - 在 Python 中验证长链条件的 Pythonic 方法

标签 python

所以我有一长串条件应该被验证为真。我没有链接很长的 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

如果您有很多条件,或者条件很昂贵,您可以改为为条件创建一个生成器,并与anyall 进行比较:

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 是否有 anyall,但它们是可以编写的微不足道的函数。

编辑 - anyall 出现在 Python 2.5 中,所以 Jython 应该有它们。

关于python - 在 Python 中验证长链条件的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431613/

相关文章:

java - 使用socket连接PC的问题

python - divmod() 是否比使用 % 和//运算符更快?

python - callable(obj) 是否尝试调用?

python - 具有非 None 类属性的类的新实例?

python - 如何获取包含列表或值的列 pandas 的唯一值?

python - 有建议的条目

python - 在 Python 中计算元组列表总和的常规方法是什么?

python - 在 Bokeh 中根据 x_range 自动设置 vbar line_width

python - 如何最好地将 NetCDF 文件集合重新分块到 Zarr 数据集

python - 我有一个带有标题的 CSV 文件。想要删除 csv 的前 5 行但不删除标题吗?在Python中