整个的处理方式太不优雅了。

ask_for_action如果的action是个callback然后返回一个Action？
如果提供了action参数那么结果就是个action，否则就是player和cards么？

我来提供一种方式，你来评估下。

ask_for_action保持不动，
ask_for_drop代替原来user_choose_cards.
在ask_for_drop的时候通过g.emit_event('use_or_drop_hook', ...)获得禁止打出/弃置的牌的列表。
然后调用ask_for_action, initiator传一个代理。这个代理hook中cond函数，加上额外的检查。

这样处理，大部分现有代码都不需要修改，也比目前的方案更灵活。

PS：ask_for_drop还是叫user_choose_card_for_drop吧……