Python 仅传递函数参数(如果存在)

Python 仅传递函数参数(如果存在),python,function,Python,Function,我将python3类函数定义如下: class class1: def funcOne(self, reqvar1, reqVar2, optVar1=default1, optVar2=default2, optVar3="server.domain", optVar4="defaultUser", optVar5="<default_Flags>"): args.inVal[1-5]在运行时在命令行上是可选的。如果它们没有被提供,我希望类函数使用默认值,如果它们被提供

我将python3类函数定义如下:

class class1:
    def funcOne(self, reqvar1, reqVar2, optVar1=default1, optVar2=default2, optVar3="server.domain", optVar4="defaultUser", optVar5="<default_Flags>"):

args.inVal[1-5]在运行时在命令行上是可选的。如果它们没有被提供,我希望类函数使用默认值,如果它们被提供,那么它们将使用提供的值

当前,如果命令行上未提供这些值,则inVal[1-5]将作为“无”传递,这将覆盖实际的默认值

类函数是单独维护的,它们管理默认值。将它们放入我的脚本(例如在argparser选项中)是不合适的

有没有一种方法可以轻松应对这种情况,而不是求助于:

if args.inVal1 and not args.inVal2...
if not args.inVal1 and args.inVal2 and not args.inVal3...
随着组合的数量越来越大

看起来应该很简单,但我这里没有连接任何东西


谢谢您的帮助。

如果您创建了一个包含可选变量名的字典,您可以将该字典传递给函数调用。我只是注释掉了argparser进行测试

class class1:
    def funcOne(self, reqvar1, reqVar2, optVar1='default1', optVar2='default2', optVar3="server.domain", optVar4="defaultUser", optVar5="<default_Flags>"):
        print(optVar1)
        print(optVar2)
        print(optVar3)
        print(optVar4)
        print(optVar5)

#argsIn=argparser.parse_args()

optionalArgs = {'optVar1': 'TestingVar1',   #args.inVal1,
                'optVar2': None,            #args.inVal2,
                'optVar3': 'TestingVar3',   #args.inVal3,
                'optVar4': None,            #args.inVal4,
                'optVar5': None}            #args.inVal5}
optionalArgsClean = {k:v for k, v in optionalArgs.items() if v is not None}

classInst=class1()
classInst.funcOne(5, 12, **optionalArgsClean)
class1类:
def funcOne(self、reqvar1、reqVar2、optVar1='default1',optVar2='default2',optVar3=“server.domain”,optVar4=“defaultUser”,optVar5=”):
打印(optVar1)
打印(optVar2)
打印(optVar3)
打印(optVar4)
打印(optVar5)
#argsIn=argparser.parse_args()
optionalArgs={'optVar1':'TestingVar1',#args.inVal1,
“optVar2”:无,#args.2,
“optVar3”:“TestingVar3”,args.inVal3,
“optVar4”:无,#args.4,
“optVar5”:无}#args.inVal5}
optionalArgsClean={k:v代表k,如果v不是None,则在optionalArgs.items()中为v}
classInst=class1()
classInst.funcOne(5,12,**可选参数清理)
运行上述代码会产生:

TestingVar1
default2
TestingVar3
defaultUser
<default_Flags>
TestingVar1
默认值2
测试变量3
默认用户

看看
**kwargs
它应该可以帮助您轻松地解决问题。您的函数定义看起来像
def funcOne(self、reqvar1、reqvar2、**kwargs)
其中
**kwargs
可以用作
dict
并包含数量可变的命名参数。。。然后您将执行例如
kwargs.get('optVar1',None)
。如果
optVar1
不存在,它将返回
None
。我知道这一点,但不幸的是,我无法控制类/函数,也无法进行更改(我可以建议,但它去了哪里,我不知道)。我是否可以简单地使用**kwargs这样的函数,并使其与原始定义保持一致?如果您使用
**kwargs
定义自己的函数,但仍然使用精确的
funcOne
函数,这将导致相同的比较问题:/I由于当前的函数定义,恐怕没有比使用
if
语句更好的方法。至少如果没有
optVar1
param,您知道您不能有任何其他参数。。(或者使用默认值没有意义)。同样,如果你有
optVar1
但没有
optVar2
你知道
optVar[2-5]
不可能存在…@Flo我很害怕。我可能会先看看是否可以更改函数。你关于optVars的陈述不一定是真的。这个function调用是有效的:funcOne(reqVar1=5,reqVar2=12,optVar4=“roUser”),所以我必须假设任何optVar都可以独立存在或以任何组合存在。从逻辑上讲,出于实际目的,一些可选值必须成对定义(例如用户和密码),但仍然有很多组合。
TestingVar1
default2
TestingVar3
defaultUser
<default_Flags>