如何定义具有可选参数的函数?

2025-02-20 09:24:00
admin
原创
79
摘要:问题描述:我有一个 Python 函数,它接受多个参数。在某些情况下,可以省略其中一些参数。def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None): #code 参数d都是h字符串,每个字符...

问题描述:

我有一个 Python 函数,它接受多个参数。在某些情况下,可以省略其中一些参数。

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

参数d都是h字符串,每个字符串都有不同的含义。重要的是,我可以选择以任意组合传递哪些可选参数。例如,(a, b, C, d, e), 或(a, b, C, g, h), 或(a, b, C, d, e, f,或全部(这些是我的选择)。

如果我可以重载该函数那就太好了——但我读到 Python 不支持重载。我尝试在列表中插入一些必需的 int 参数——但出现了参数不匹配错误。

现在,我正在发送空字符串来代替前几个缺失的参数作为占位符。我希望能够仅使用实际值来调用函数。

有什么办法吗?我可以传递列表而不是参数列表吗?

现在使用 ctypes 的原型看起来像这样:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]

解决方案 1:

只需使用*args参数,它允许您在之后传递任意数量的参数a,b,c。您必须向 map args->添加一些逻辑c,d,e,f,但这是一种重载的“方式”。

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

它将打印出c,d,e,f


类似地,您可以使用kwargs参数,然后可以命名您的参数。

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

然后kwargs会有一个包含所有键值参数的字典a,b

解决方案 2:

尝试像这样调用它:obj.some_function( '1', 2, '3', g="foo", h="bar" )。在必需的位置参数之后,您可以通过名称指定特定的可选参数。

解决方案 3:

这很容易

def foo(a = None):
       print(a)

“无”可以被任何其他默认值替换。

例如,如果没有为函数提供参数foo(),那么您认为它会打印什么?答案是“无”。为什么?因为没有提供参数,默认值是“无”

但是,如果你给它一个参数,例如foo("hello world")......鼓声响起......它将打印“hello world”。

还有一件事你应该记住,我显然忘了告诉你。这些“可选参数”需要位于所有其他参数之后。这意味着,让我们采用上一个函数并添加另一个参数b

#def foo(a = None, b): 
#    print("Value of a is", a, " and value of b is", b)

def foo(b, a=None): 
    print("Value of a is", a, " and value of b is", b)

第一个函数(注释掉的那个)会产生错误,因为可选参数“a”位于必需参数“b”之前。但第二个定义肯定会起作用。

因此,您必须将可选参数放在必需参数之后。

解决方案 4:

=None必需参数在前,可选参数在后。可选参数始终以.开头。

简单快捷的示例:

def example_function(param1, param2, param3=None, param4=None):
    pass

# Doesn't work, param2 missing
example_function("hello")

# Works
example_function("hello", "bye")

# Works. Both the same
example_function("hello", "bye", "hey")
example_function("hello", "bye", param3="hey")

# Works. Both the same
example_function("hello", "bye", "hey", "foo")
example_function("hello", "bye", param3="hey", param4="foo")

解决方案 5:

检查一下:

from typing import Optional

def foo(a: str, b: Optional[str] = None) -> str or None:
    pass

解决方案 6:

为了更好地了解传递参数时可能发生的情况,参考各种选项确实很有帮助:位置或关键字(argarg="default_value")、仅位置(/,在参数列表之前)、仅关键字(*,在参数列表之后)、可变位置(通常*args)或可变关键字(通常**kwargs)。请参阅 Python 文档以获得出色的摘要;该问题的其他各种答案都利用了大多数这些变体。

由于您的示例中始终有参数 a、b、c,并且您似乎以位置方式调用它们,因此您可以通过添加使其更加明确/,

def some_function (self, a, b, c, /, d = None, e = None, f = None, g = None, h = None):
    #code

解决方案 7:

使 Avión 的答案适用于向量参数输入;

def test(M,v=None):
    try: 
        if (v==None).all() == False:
            print('argument passed')
            return M + v 
    except: 
        print('no argument passed')
        return M 

其中 M 是某个矩阵,v 是某个向量。当我尝试使用 if 语句而不使用“try/except”语句时,test(M) 和 test(M,v) 都会产生错误。

正如 cem 所提到的,升级到 python 3.10 将允许 union (x|y)(或 Optional[...])功能,这可能会为替代方法打开一些大门,但我正在使用 Anaconda spyder 所以我想我必须等待新版本才能使用 python 3.10。

解决方案 8:

Python 函数可以接受一些参数,例如,

def add(x,y):
    return x+ y

# calling this will require only x and y
add(2,3) # 5

如果我们想添加尽可能多的参数,我们只需使用 ,*args它将是一个比您先前定义的形式参数数量更多的参数列表(xy)。使用*args,可以将任意数量的额外参数附加到您当前的形式参数上。

def add(x, y, *args):
    return x + y + sum(args)
    
add(1,2,3,4,5,6) # 21
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3983  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2747  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   79  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用