如果在Python

时间:2018-05-23 10:38:21

标签: python

我试图制作一个特定的棋盘游戏,并且在查找变量中是否存在某个属性时会遇到一些麻烦。" to"和"玩"

index_error_lst = []

if hasattr(play, 'player_no'):
    index_error_lst.append(play.discard_pile_no)
if hasattr(play, 'player_no'):
    index_error_lst.append(play.player_no)
if hasattr(to, 'discard_pile_no'):
    index_error_lst.append(to.discard_pile_no)
if hasattr(to, 'build_pile_no'):
    index_error_lst.append(to.build_pile_no)
if hasattr(to, 'player_no'):
    index_error_lst.append(to.player_no)
if sorted(index_error_lst)[-1] > 3:
    return 0

我觉得这种方法是一种非常冗长乏味的方法,用于检查类中是否存在属性。有没有办法通过属性进行for循环检查并追加那些存在并继续那些不属于那些?

最后两行用于检查index_error_lst并查看这些属性中的任何数字是否大于3(这是最大玩家数/最大卡堆数)并返回错误。

谢谢!

1 个答案:

答案 0 :(得分:0)

功能性方法如何:

from itertools import product

# ...

index_error_lst = filter(
                      # Filter out not-found or None values
                      lambda value: value is not None, 

                      map(
                          # Will receive tuple (obj, attr)
                          # Attempt to get the value or fallback to None
                          lambda attr: getattr(attr[0], attr[1], None),

                          # Cartesian product of its arguments
                          product(
                              (play, to), 
                              ('player_no', 'discard_pile_no', 'build_pile_no')
                          )
                      )
                  )

# ...

if any(value > 3 for value in index_error_lst):
    return 0