【问题标题】:Having arbitrary number of arguments with a named default in python在python中具有任意数量的具有命名默认值的参数
【发布时间】:2023-03-10 21:42:01
【问题描述】:

我想在 python 中编写一个函数,除了一个命名参数(具有默认值)之外,它还可以接收任意数量的未命名参数。

例如,我想写这样的东西

def myFunc(*args, optDefault=1):

但这只是给出了一个语法错误。有没有等效的方法来做到这一点?

【问题讨论】:

    标签: python function arguments


    【解决方案1】:

    怎么样

    def myFunc(*args, **kwargs):
        optDefault = kwargs.pop('optDefault', 1)
        assert kwargs == {}, "There may only be one keyword argument to myFunc"
    

    不是最漂亮的,但它确实有效。

    【讨论】:

    • assert not(kwargs) 是一个更好的成语;)
    • GaretJax:我想这是一个品味问题 :-) 不是作为一个函数?糟糕!
    • 这样的事情应该导致TypeError,而不是AssertionError。是的,not kwargs 更惯用(尽管多态在这里并不重要,但假设type(kwarg) is dict 是一个相当省钱的赌注)。
    【解决方案2】:

    怎么样:

    def myFunc(optDefault=1, *args):
    

    【讨论】:

    • 谢谢!但我不知道怎么称呼它。 myFunc(optDefault=3,1,2) 和 myFunc(1,2,optDefault=3) 都报错。
    • @highBandWidth myFunc(3,1,2) 怎么样?
    • @Shaokan:你的建议会打败拥有关键字 args 的点(无论是什么高带宽)...
    【解决方案3】:

    你为什么不使用this, 一个例子(我借用here

    import optparse
    
    if __name__=="__main__":
        parser = optparse.OptionParser("usage: %prog [options] arg1 arg2")
        parser.add_option("-H", "--host", dest="hostname",
                          default="127.0.0.1", type="string",
                          help="specify hostname to run on")
        parser.add_option("-p", "--port", dest="portnum", default=80,
                          type="int", help="port number to run on")
    
        (options, args) = parser.parse_args()
        if len(args) != 2:
            parser.error("incorrect number of arguments")
        hostname = options.hostname
        portnum = options.portnum
    

    【讨论】:

    • optparse is deprecated 并用于其他用途(解析命令行选项)。
    猜你喜欢
    • 2013-08-02
    • 2021-09-24
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2016-10-30
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多