当前位置: 首页 > 知识库问答 >
问题:

计算作为位置传递的参数数

陆沈浪
2023-03-14
def foo(x, y):
    pass
def foo(x, y):
    if passed_positionally(y):
        print('y was passed positionally!')
    else:
        print('y was passed with its keyword')

这样我就能得到

>>> foo(3, 4)
y was passed positionally
>>> foo(3, y=4)
y was passed with its keyword

我意识到我最初并没有指定这一点,但是是否可以在保留类型注释的同时做到这一点呢?到目前为止,最重要的答案是使用一个装饰器--但是,它并不保留返回类型

共有1个答案

嵇永望
2023-03-14

您可以创建一个装饰器,如下所示:

def checkargs(func):
    def inner(*args, **kwargs):
        if 'y' in kwargs:
            print('y passed with its keyword!')
        else:
            print('y passed positionally.')
        result = func(*args, **kwargs)
        return result
    return inner

>>>  @checkargs
...: def foo(x, y):
...:     return x + y

>>> foo(2, 3)
y passed positionally.
5

>>> foo(2, y=3)
y passed with its keyword!
5

当然,您可以通过允许decorator接受参数来改进这一点。因此,您可以传递您想要检查的参数。应该是这样的:

def checkargs(param_to_check):
    def inner(func):
        def wrapper(*args, **kwargs):
            if param_to_check in kwargs:
                print('y passed with its keyword!')
            else:
                print('y passed positionally.')
            result = func(*args, **kwargs)
            return result
        return wrapper
    return inner

>>>  @checkargs(param_to_check='y')
...: def foo(x, y):
...:     return x + y

>>> foo(2, y=3)
y passed with its keyword!
5

我认为添加funcools.wraps将保留注释,以下版本还允许对所有参数执行检查(使用inspect):

from functools import wraps
import inspect

def checkargs(func):
    @wraps(func)
    def inner(*args, **kwargs):
        for param in inspect.signature(func).parameters:
            if param in kwargs:
                print(param, 'passed with its keyword!')
            else:
                print(param, 'passed positionally.')
        result = func(*args, **kwargs)
        return result
    return inner

>>>  @checkargs
...: def foo(x, y, z) -> int:
...:     return x + y

>>> foo(2, 3, z=4)
x passed positionally.
y passed positionally.
z passed with its keyword!
9

>>> inspect.getfullargspec(foo)
FullArgSpec(args=[], varargs='args', varkw='kwargs', defaults=None, 
kwonlyargs=[], kwonlydefaults=None, annotations={'return': <class 'int'>})
                                             _____________HERE____________
 类似资料:
  • 我有两个功能。一个是,它以Int x和函数p作为参数,并返回布尔结果p(x)。就这么简单。 然后我有第二个函数,它就像 在调用时,有没有办法更改,使其像?(如果f返回true,则将其设为false) 比如: 我知道我可以通过masterChecker调用,但我想知道的是,是否可以更改作为参数传递的函数行为。

  • 我有一个表单,它有4个文本字段,我试图用一个有5列的ObservableList来跟踪它。TableView有一个额外的列来保存计算值(ObservableList中的第5列)。 数据来自4个文本字段,但计算列显示为空。我假设这是我的getter和setter的问题,因为值是在我将其传递给数据模型之前计算的,我刚刚测试了数据模型,它正在获取值(作为参数传递)。 为了不把无关的代码放在这里,我认为这

  • 问题内容: 我有3类调用,和。 在我的课程中,我想要一个这样的方法: 因此,例如,我想: 如何将类名作为参数,并基于该类名从类名创建适当的对象? 问题答案: 使用反射是可能的。这里是给定的className(作为字符串传递)。此类将在内存中搜索(应该已经加载)。 作为字符串传递时要实例化的类的名称应 完全限定

  • 我有一个简单的方法,我想把片段名作为参数传递。我几乎没有像这样的碎片 1) AddNewDatesFragment 2) AskFragment 3)免责声明片段 我有下面的代码可以正常工作 我想在方法中编写一些代码,在这里我可以调用这样的方法 等 我曾经尝试过这样的代码,但在if条件下不工作会导致编译时错误。 我对实施这种方法感到好奇。谢谢

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。