Python在基于if检查的方法调用中传递第二个参数

Python在基于if检查的方法调用中传递第二个参数,python,Python,有没有办法把这个伪代码变成真正的代码 get_quest_guide_char("isabelle", if game.location == "school_english_class": marker_sector="right_bottom")) 因此,marker_sector=right_bottom仅成为基于if检查的第二个参数 如果If检查失败,则传递的唯一参数是isabelle,您可以这样做 get_quest_guide_char("isabelle", marker_sec

有没有办法把这个伪代码变成真正的代码

get_quest_guide_char("isabelle", if game.location == "school_english_class": marker_sector="right_bottom"))
因此,marker_sector=right_bottom仅成为基于if检查的第二个参数

如果If检查失败,则传递的唯一参数是isabelle,您可以这样做

get_quest_guide_char("isabelle", marker_sector="right_bottom" if game.location == "school_english_class" else None))
只有当game.location==school\u english\u class时,它才会传递给函数right\u bottom,否则它将不传递,然后在函数中处理None。
如果函数定义为get_quest_guide_charisabelle_value,marker_sector,那么如果game.location==school\u english\u class else没有marker_sector=,就可以使用右下角。可能最好在方法调用之外构建额外的参数,如果方法参数开始增加,则更易于阅读

参数={} 如果game.location==学校英语课程: 参数['mark_sector']=右下角 获取任务向导charisabelle,**参数
函数/方法用于根据其声明和用法传递参数。在声明或使用过程中进行评估或任何操作都是一种糟糕的方法和设计

使用变量位置参数如*args和*kwargs有什么害处?代码应该简化,而不是复杂化。最重要的是,考虑单元测试您的代码功能/代码?或者您可能对单元测试不感兴趣。我也建议你去

您可以在if条件下进行求值,然后将其作为参数传递。在您的情况下,您可以简单地执行以下操作:

您的函数声明:

def get_quest_guide_char(name: str, **kwargs):
    if 'marker_sector' in kwargs:
        market_sector = kwargs.get('marker_sector')
如果需要传递多个其他参数,可以迭代kwargs dict:

def get_quest_guide_char(name: str, **kwargs):
    for key, value in kwargs.items():
        if key == 'marker_sector':
           market_sector = value
用法:

 if value == "school_english_class":
        get_quest_guide_char(name="isabelle", marker_sector="right_bottom")
    else:
        get_quest_guide_char(name="isabelle")

注意:我为值“isabelle”使用了命名参数以使事情更简单,您可以选择省略或使用。

与我之前的其他答案一样,从技术上讲,这仍然传递至少两个参数。这是因为函数重载在Python中并不是一件真正的事情,它具有多个同名函数。如果需要可变数量的参数,可以在调用函数时使用*args和/或**kwargs,但从技术上讲,函数仍必须使用多个参数定义:

def get_quest_guide_char(character, *args, **kwargs):
    # ...

# or in your case
def get_quest_guide_char(character, *args):
    # ...
或者更明确地说:

def get_quest_guide_char(character, marker_sector=None):
    # ...
这将使您可以同时执行以下两项操作:

get_quest_guide_char("isabelle", marker_sector)

# and
get_quest_guide_char("isabelle")
考虑到marker_扇区取决于game.location,您也可以创建另一个函数,为您提供marker_扇区,并简单地将其传递给您的函数:

def get_marker_sector(location):
    if (location == "school_english_class"):
        marker_sector = "right_bottom"
    else:
        # ...

    return marker_sector

marker_sector = get_marker_sector(game.location)
get_quest_guide_char("isabelle", marker_sector):
或者,您可以将game.location传递给get_quest_guide_char函数:

def get_quest_guide_char(character, location):
    if (location == "school_english_class"):
        # ...
    else:
        # ...

get_quest_guide_char("isabelle", game.location)

无论如何,我希望您不打算在任何函数中使用marker_sector作为全局变量。可变全局变量会带来麻烦。

get\u quest\u guide\u char如何处理marker\u扇区变量?您可以选择将其设置为“无”或不与实际的if语句一起传递,但第一个选项将取决于get_quest_guide_char是否正确处理marker_sector=None。这始终需要第二个参数。对我来说,如果if检查失败,那么就没有第二个参数了。到目前为止最好的方法是:get_quest_Guident_charisabelle,***{marker_sector:right_bottom for x in[1]*game.location==school_english_class}这一行**{marker_sector:right_bottom for x in[1]*game.location==school_english_class}将传递函数{marker_sector:[]},该函数与marker_sector=[]相同,所以在我的答案中用[]同样,将空列表传递给函数不是最佳做法。