相关疑难解决方法(0)

如何制作一系列功能装饰器?

如何在Python中创建两个装饰器来执行以下操作?

@makebold
@makeitalic
def say():
   return "Hello"
Run Code Online (Sandbox Code Playgroud)

...应该返回:

"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)

我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.

python decorator python-decorators

2647
推荐指数
17
解决办法
49万
查看次数

Django身份验证和Ajax - 需要登录的URL

我想在我的Django编码网站上添加一些Ajax -niceness.

在我的Django代码中,我使用@login_requireddecorator django.contrib.auth.decorators来标记哪个视图需要身份验证.未经过身份验证的用户单击它时的默认行为是将他/她重定向到登录页面,然后传递目标页面.

我在一些网站上看到的,并且非常喜欢的是,当用户点击指向仅限已登录用户的位置的链接时,他/她会获得一个弹出窗口(通过JavaScript)询问,而不是重定向到登录页面他/她登录或注册.没有重定向部分,因此如果用户决定他/她确实不喜欢网站足以浪费时间注册,则不需要用户使用"后退"键.

所以,问题是:你如何管理自动将某些链接标记为"受限制"的任务,以便JavaScript可以处理他们的onclick事件并显示"请登录"弹出窗口?

javascript python authentication django

49
推荐指数
3
解决办法
2万
查看次数

基于Python类的装饰器,其参数可以修饰方法或函数

我见过很多Python装饰器的例子:

  • 函数样式装饰器(包装函数)
  • 类风格装饰(实施__init__,__get____call__)
  • 不带参数的装饰器
  • 带参数的装饰器
  • "方法友好"的装饰器(即可以在类中装饰方法)
  • "函数友好"的装饰器(可以装饰普通函数
  • 可以装饰方法和功能的装饰器

但我从来没有见过一个可以完成上述所有工作的例子,而且我很难从特定问题的各种答案中综合出来(比如这一个,这一个,或者这一个(它有一个最好的答案)我曾见过SO)),如何结合以上所有内容.

我想要的是一个基于类的装饰器,它可以装饰方法或函数,并且至少需要一个额外的参数.即以下内容可行:

class MyDecorator(object):
    def __init__(self, fn, argument):
        self.fn = fn
        self.arg = argument

    def __get__(self, ....):
        # voodoo magic for handling distinction between method and function here

    def __call__(self, *args, *kwargs):
        print "In my decorator before call, with arg %s" % self.arg
        self.fn(*args, **kwargs)
        print "In my decorator after call, with arg %s" …
Run Code Online (Sandbox Code Playgroud)

python methods arguments function decorator

39
推荐指数
3
解决办法
2万
查看次数

如何用装饰器类装饰实例方法?

考虑这个小例子:

import datetime as dt

class Timed(object):
    def __init__(self, f):
        self.func = f

    def __call__(self, *args, **kwargs):
        start = dt.datetime.now()
        ret = self.func(*args, **kwargs)
        time = dt.datetime.now() - start
        ret["time"] = time
        return ret

class Test(object):
    def __init__(self):
        super(Test, self).__init__()

    @Timed
    def decorated(self, *args, **kwargs):
        print(self)
        print(args)
        print(kwargs)
        return dict()

    def call_deco(self):
        self.decorated("Hello", world="World")

if __name__ == "__main__":
    t = Test()
    ret = t.call_deco()
Run Code Online (Sandbox Code Playgroud)

打印

Hello
()
{'world': 'World'}
Run Code Online (Sandbox Code Playgroud)

为什么self参数(应该是Test obj实例)不作为第一个参数传递给装饰函数decorated

如果我手动完成,例如:

def call_deco(self):
    self.decorated(self, "Hello", …
Run Code Online (Sandbox Code Playgroud)

python class self python-decorators

32
推荐指数
2
解决办法
1万
查看次数

Python装饰,自我混淆了

我是Python修饰者的新手(哇,很棒的功能!),我无法让下面的代码工作,因为self参数混淆了.

#this is the decorator
class cacher(object):

    def __init__(self, f):
        self.f = f
        self.cache = {}

    def __call__(self, *args):
        fname = self.f.__name__
        if (fname not in self.cache):
            self.cache[fname] = self.f(self,*args)
        else:
            print "using cache"
        return self.cache[fname]

class Session(p.Session):

    def __init__(self, user, passw):
        self.pl = p.Session(user, passw)

    @cacher
    def get_something(self):
        print "get_something called with self = %s "% self
        return self.pl.get_something()

s = Session(u,p)
s.get_something()
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

get_something called with self = <__main__.cacher object at 0x020870F0> 
Traceback:
...
AttributeError: 'cacher' …
Run Code Online (Sandbox Code Playgroud)

python python-decorators

17
推荐指数
1
解决办法
5355
查看次数

使用与函数和方法相同的装饰器(带参数)

我一直在尝试创建一个可以在python中与函数和方法一起使用的装饰器.它本身就不那么难,但是当创建一个带参数的装饰器时,它似乎就是这样.

class methods(object):
    def __init__(self, *_methods):
        self.methods = _methods

    def __call__(self, func): 
        def inner(request, *args, **kwargs):
            print request
            return func(request, *args, **kwargs)
        return inner

    def __get__(self, obj, type=None):
        if obj is None:
            return self
        new_func = self.func.__get__(obj, type)
        return self.__class__(new_func)
Run Code Online (Sandbox Code Playgroud)

上面的代码正确地包装了函数/方法,但是在方法的情况下,request参数是它正在操作的实例,而不是第一个非自身参数.

有没有办法判断装饰器是否应用于函数而不是方法,并相应地处理?

python methods arguments function decorator

14
推荐指数
3
解决办法
4431
查看次数

可以在python中更改函数的repr吗?

我只看过__repr__在类定义中设置方法的示例.是否__repr__可以在定义中或定义后更改for函数?

我试图没有成功......

>>> def f():
    pass
>>> f
<function f at 0x1026730c8>
>>> f.__repr__ = lambda: '<New repr>'
>>> f
<function __main__.f>
Run Code Online (Sandbox Code Playgroud)

python function repr

14
推荐指数
3
解决办法
4119
查看次数

使用类作为另一个类的方法的装饰器

我在使用一个类来装饰另一个类的方法时遇到问题。代码如下:

class decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args):
        return self.func(*args)

class test(object):
    @decorator
    def func(self, x, y):
        print x, y

t = test()
t.func(1, 2)
Run Code Online (Sandbox Code Playgroud)

它显示这个错误

TypeError: func() takes exactly 3 arguments (2 given).
Run Code Online (Sandbox Code Playgroud)

如果使用以下方式调用:

t.func(t, 1, 2)
Run Code Online (Sandbox Code Playgroud)

然后它就过去了。但如果装饰器被拿走,那么这条线又会出现问题。

为什么会发生这种情况以及如何解决?

编辑:显示自我的代码的第二个版本decorator.__call__应该与以下自我不同test.func

class decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args):
        return self.func(*args)

class test(object):
    def __init__(self):
        self.x = 1
        self.y = 2
    @decorator
    def func(self):
        print self
        print self.x, …
Run Code Online (Sandbox Code Playgroud)

python methods class decorator

2
推荐指数
1
解决办法
646
查看次数