【问题标题】:method's arguments not being passed to decorator方法的参数未传递给装饰器
【发布时间】:2013-11-01 22:04:12
【问题描述】:

嘿,我有一个方法定义如下:

from x.y import util
class my_Class(some_object):
    @util.myDecorator
    def foo(self, log_file):
    '''
    Test that search entered into the search bar is the search being
    executed in the job.
    '''
    self.some_page.open()
    textarea = self.some_page.searchbar

    searchbar.run_search(log_file.search_string)
    self.browser.capture_screenshot()
    self.some_page.jobstatus.wait_for_job_complete()

    self.verify_equals(
        self.some_page.jobstatus.event_count,
        log_file.event_count,
        "Event count doesn't seem to be right.")

装饰器在 util.py 文件中

def mydecorator(func):
    def timeit(*args, **kwargs):
        start_time = time.time()
        ret=func(*args, **kwargs)
        end_time = time.time()
        print end_time - start_time
        return ret
    return timeit

当我尝试执行代码时,它在ret=func(*args, **kwargs) 失败并显示错误消息

TypeError: foo() 只接受 2 个参数(给定 1 个)

  • 我打印了 *args 的内容(使用 ','.join(str(each) for each in args))来查看它包含的内容,然后打印出来了

<....my_class ...>

装饰器适用于只有一个 arg (self) 的方法。我在这里错过了什么吗?

【问题讨论】:

  • 如何调用foo 方法? my_Class().foo()?
  • 你是怎么打电话给foo()的?这有效:my_Class().foo(123)。这不是:my_Class().foo().
  • 我正在使用 py.test 调用方法 foo py.test -k foo file_name.py
  • 如果你使用 pytest,你必须给这些测试添加参数...
  • 请提供完整的失败 pytest 示例。你有多个装饰函数吗?

标签: python decorator


【解决方案1】:

当您回答 cmets 时,请注意它有效:

>>> import time
>>>
>>> def mydecorator(func):
...     def timeit(*args, **kwargs):
...         start_time = time.time()
...         ret=func(*args, **kwargs)
...         end_time = time.time()
...         print end_time - start_time
...         return ret
...     return timeit
...
>>> class my_Class(object):
...     @mydecorator
...     def foo(self, arg_1):
...         print arg_1
...
>>> my_Class().foo(100)
100
0.0

【讨论】:

  • 这也适用于我。但是,正如上面评论中提到的,我正在尝试使用 py.test py.test -k foo file_name.py 调用此方法 foo (即测试)
  • 但是你认为 pytest 会传递给 foo 的 arg_1 是什么?
  • 它是一个日志文件。当我不使用装饰器时,日志文件会顺利通过。我尝试在其他几个超过 1 个参数的测试中使用这个装饰器。我遇到了同样的错误。
猜你喜欢
  • 2013-03-10
  • 2018-06-07
  • 2014-11-17
  • 1970-01-01
  • 2021-11-21
  • 2016-03-01
  • 2018-08-24
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多