Python 3.x Python函数参数的外部和内部关键字名称不同?

Python 3.x Python函数参数的外部和内部关键字名称不同?,python-3.x,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

调用函数时是否可以使用与函数体本身不同的关键字名称?例如,在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")

所以当你叫它时,它读起来更像一个句子。在我看来,“名字叫杰弗里的人”比“名字叫杰弗里的人”读起来更流利。

如果没有具体的例子或用例,你真的很难理解你在问什么。但是,如果您只想让
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的人更加困惑。他们会发现,为了设置
name=foo
,必须通过
和_name=foo
,这非常令人困惑

幸运的是,没有。你能说出一个实际有用的用例吗?你可以将变量分配给函数中的另一个变量,但我没有看到任何合法的用例。首先使用一个有意义的名称我编辑了以添加用例@DeepSpace,我在这两种情况下都使用有意义的名称,但根据上下文的不同,我相信使用单独的名称可能会提高可读性,尽管这会使函数定义语法复杂化。No。它不能提高可读性。它只是增加了复杂性,无论是在语法上还是在逻辑上。这完全是一个观点问题,但你说它就像事实@DeepSpace。在调用函数时,我认为它读起来更好。“在我看来”。显然,它确实使函数定义更难阅读,因为它需要额外的名称规范,而且您必须知道语法。从逻辑上讲,这两个函数是相同的,除了我刚才介绍的情况,参数有两个名称(一个用于函数内部,一个用于调用函数)。所以从逻辑上讲,它的意义与使用参数的两个名称之前是一样的。虽然我问了这个问题,但我承认在需要这样做的情况下确实没有用例,我只是想知道是否有一个类似于Swift的特性。你的代码完成了这项工作。如果您认为with_name语法更好,那么它的唯一用途就是改进可选可读性。显然没有这样的特性,尽管您的解决方案可行,但我认为实现这样的代码是愚蠢的,因为它需要特定的“with_”,很快就会混淆并增加一层不必要的复杂性。我只会使用可选语法的解决方案。