Python函数参数使用不同的外部和内部关键字名称吗?

时间:2018-07-11 17:44:21

标签: python-3.x

调用函数时,是否可以使用与函数体内部不同的关键字名称?例如,在Swift中,您可以定义:

func person(with_name name: str) -> Person {
    return Person(name: name)
}


var p = person(with_name: "Jeffry Mills") # p is now a person object with the name jeffry Mills

有什么办法可以在Python中模仿吗?尽管Python 3.7允许类型注释,但镜像语法无效:

def person(with_name name: str): # Invalid Syntax
    return Person(name=name)

p = person(with_name="Jeffry Mills") # Looking for something similar to this

我正在寻找它,因为我认为它有助于提高可读性。

编辑:

评论要求用例。在没有用例中,解决问题的方法根本没有不同,我只是认为这有助于提高可读性。

我上面的代码作为示例。当您想通过我们的包装函数创建一个新的person实例时,它会写

person(with_name="Jeffry")

因此,当您调用它时,它的读起来更像句子。与“人名杰弗里”相比,“人名杰弗里的人”对海事组织的理解更为流利。

1 个答案:

答案 0 :(得分:1)

如果没有具体的示例或用例,很难理解您的要求。但是,如果您只想让p = Person(with_name="Jeffry")返回一个Person属性且name属性设置为“ Jeffry”的对象,那很容易做到。您的函数可以简单地遍历参数,并将以with_开头的任何参数更改为不带with_的变量。

例如:

class Person():
    def __init__(self, name):
        self.name = name

def person(**kwargs):
    attrs = {}
    for key, value in kwargs.items():
        if key.startswith("with_"):
            key_name = key[5:]
            attrs[key_name] = value

    return Person(**attrs)

p = person(with_name="Jeffry")
print("name is", p.name)

运行时,它输出以下内容:

name is Jeffry

就我个人而言,我绝不允许此代码通过代码审查,因为这会使代码对理解python的任何人更加混乱。他们会发现必须通过with_name=foo才能设置name=foo非常令人困惑。