python:是否可以要求函数的参数都是关键字?

发布于 2024-12-07 08:43:49 字数 48 浏览 1 评论 0原文

为了避免明显的错误,我想防止在某些函数中使用位置参数。有什么办法可以实现这一点吗?

To avoid the obvious bugs, I'd like to prevent the use of positional arguments with some functions. Is there any way to achieve that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

慕烟庭风 2024-12-14 08:43:49

只有 Python 3 可以正确执行此操作(并且您使用了 python3 标记,因此没问题):

def function(*, x, y, z):
    print(x,y,z)

使用 **kwargs 将允许用户输入任何参数,除非您稍后检查。此外,它还会隐藏真实的参数名称以防止自省。

**kwargs 不是这个问题的答案。

测试程序:

>>> function(1,2,3)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    function(1,2,3)
TypeError: function() takes exactly 0 positional arguments (3 given)
>>> function(x=1, y=2, z=3)
1 2 3

Only Python 3 can do it properly (and you used the python3 tag, so it's fine):

def function(*, x, y, z):
    print(x,y,z)

using **kwargs will let the user input any argument unless you check later. Also, it will hide the real arguments names from introspection.

**kwargs is not the answer for this problem.

Testing the program:

>>> function(1,2,3)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    function(1,2,3)
TypeError: function() takes exactly 0 positional arguments (3 given)
>>> function(x=1, y=2, z=3)
1 2 3
七色彩虹 2024-12-14 08:43:49

您可以定义一个装饰器,如果它装饰的函数使用任何位置参数,则使用内省会导致错误。这允许您防止在某些函数中使用位置参数,同时允许您根据需要定义这些函数。

举个例子:

def kwargs_only(f):
    def new_f(**kwargs):
        return f(**kwargs)
    return new_f

要使用它:

@kwargs_only
def abc(a, b, c): return a + b + c

您不能这样使用它(类型错误):

abc(1,2,3)

您可以这样使用它:

abc(a=1,b=2,c=3)

更强大的解决方案将使用 decorator 模块。

免责声明:不保证深夜答案!

You could define a decorator that, using introspection, causes an error if the function that it decorates uses any positional arguments. This allows you to prevent the use of positional arguments with some functions, while allowing you to define those functions as you wish.

As an example:

def kwargs_only(f):
    def new_f(**kwargs):
        return f(**kwargs)
    return new_f

To use it:

@kwargs_only
def abc(a, b, c): return a + b + c

You cannot use it thus (type error):

abc(1,2,3)

You can use it thus:

abc(a=1,b=2,c=3)

A more robust solution would use the decorator module.

Disclaimer: late night answers are not guaranteed!

走过海棠暮 2024-12-14 08:43:49

是的,只需使用 **kwargs 构造并仅从那里读取您的参数。

def my_function(**kwargs):
    for key, value in kwargs.iteritems():
        print ("%s = %s" % (key, value))

my_function(a="test", b="string")

Yes, just use the **kwargs construct and only read your parameters from there.

def my_function(**kwargs):
    for key, value in kwargs.iteritems():
        print ("%s = %s" % (key, value))

my_function(a="test", b="string")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文