如何在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在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
嗨我有类似下面的东西.基本上我需要从定义中的实例方法使用的装饰器访问实例方法的类.
def decorator(view):
# do something that requires view's class
print view.im_class
return view
class ModelA(object):
@decorator
def a_method(self):
# do some stuff
pass
Run Code Online (Sandbox Code Playgroud)
代码原样给出
AttributeError: 'function' object has no attribute 'im_class'
我发现类似的问题/答案 - Python装饰器让函数忘记它属于一个类和Python装饰器中的Get类 - 但这些依赖于一种解决方法,它通过抢夺第一个参数在运行时抓取实例.在我的情况下,我将基于从其类中收集的信息调用该方法,因此我不能等待来电.
谢谢.
我有一个像下面的装饰.
def myDecorator(test_func):
return callSomeWrapper(test_func)
def callSomeWrapper(test_func):
return test_func
@myDecorator
def someFunc():
print 'hello'
Run Code Online (Sandbox Code Playgroud)
我想增强这个装饰器来接受另一个如下所示的参数
def myDecorator(test_func,logIt):
if logIt:
print "Calling Function: " + test_func.__name__
return callSomeWrapper(test_func)
@myDecorator(False)
def someFunc():
print 'Hello'
Run Code Online (Sandbox Code Playgroud)
但是这段代码给出了错误,
TypeError:myDecorator()只需要2个参数(给定1个)
为什么函数不会自动通过?如何将函数显式传递给装饰器函数?
使用Python 3.4 asyncio库编写代码单元测试的最佳方法是什么?假设我想测试TCP客户端(SocketConnection):
import asyncio
import unittest
class TestSocketConnection(unittest.TestCase):
def setUp(self):
self.mock_server = MockServer("localhost", 1337)
self.socket_connection = SocketConnection("localhost", 1337)
@asyncio.coroutine
def test_sends_handshake_after_connect(self):
yield from self.socket_connection.connect()
self.assertTrue(self.mock_server.received_handshake())
Run Code Online (Sandbox Code Playgroud)
当使用默认测试运行器运行此测试用例时,测试将始终成功,因为该方法仅执行到第一yield from条指令,之后它在执行任何断言之前返回.这导致测试总是成功.
是否有预先构建的测试运行器能够处理这样的异步代码?
python unit-testing python-3.x python-unittest python-asyncio
from functools import wraps
def foo_register(method_name=None):
"""Does stuff."""
def decorator(method):
if method_name is None:
method.gw_method = method.__name__
else:
method.gw_method = method_name
@wraps(method)
def wrapper(*args, **kwargs):
method(*args, **kwargs)
return wrapper
return decorator
Run Code Online (Sandbox Code Playgroud)
例如:下面的装饰my_function用foo_register的,而不是它曾经做对decorator.
@foo_register
def my_function():
print('hi...')
Run Code Online (Sandbox Code Playgroud)
示例:以下按预期工作.
@foo_register('say_hi')
def my_function():
print('hi...')
Run Code Online (Sandbox Code Playgroud)
如果我希望它在两个应用程序中正常工作(一个使用method.__name__和一个传递名称),我必须检查内部foo_register是否第一个参数是装饰器,如果是,我必须:( return decorator(method_name)而不是return decorator).这种"检查它是否可以调用"似乎非常hackish.有没有更好的方法来创建这样的多用途装饰器?
PS我已经知道我可以要求装饰器被调用,但这不是一个"解决方案".我希望API感觉自然.我的妻子喜欢装饰,我不想破坏它.
官方文档解释了如何装饰基于类的视图,但是我找不到有关如何为装饰器提供参数的任何信息.
我想实现类似的东西
class MyView(View):
@method_decorator(mydecorator, some_parameters)
def dispatch(self, *args, **kwargs):
return super(MyView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这相当于
@mydecorator(some_parameters)
def my_view(request):
....
Run Code Online (Sandbox Code Playgroud)
我该如何处理这类案件?
我已经看到如何在装饰器中使用上下文管理器以及如何将装饰器中创建的对象传递给装饰函数以及带参数的python装饰器,我正在尝试将两者结合起来.但我正在努力让我的头围绕它.
@wrap如果可能的话,我宁愿使用func工具装饰器来执行此操作,因为我知道是否会保留doc字符串.
我想要做的是:
def pyro_opener(func,service,database,port,secret_key):
def wrapper(params):
with Pyro4.Proxy("PYRO:"+service+"@"+database+":"+port) as obj:
obj.set_secret_key(secret_key)
return obj.func(params)
return wrapper
@pyro_opener(output_service, employee_db,port=9876,secret_key="h3llow0rld")
def get_employee_names(salary):
return obj.return_employee_names(salary) # obj is clearly not in scope here
# but what else can I do?
get_employee_names(25000)
>>>> Bob, Jane, Mary
Run Code Online (Sandbox Code Playgroud)
我认为这不起作用,方法return_employee_names是在连接另一端的服务上.我应该只返回函数调用吗?如果是这样,我怎么通过params呢?
我用“max_instances = 10”设置调度程序。可以同时运行10个作业。有时有些作业被阻塞,它会挂在那里。当超过10个作业在那里阻塞时,“跳过:运行的最大数量”的例外实例达到(10)”。APScheduler 是否有办法设置作业持续时间的最长时间。如果作业运行超过最长时间,它将被终止。如果没有办法,我该怎么办?
这是我尝试正确键入注释的确切函数:
F = TypeVar('F', bound=Callable[..., Any])
def throttle(_func: Optional[F] = None, *, rate: float = 1) -> Union[F, Callable[[F], F]]:
"""Throttles a function call, so that at minimum it can be called every `rate` seconds.
Usage::
# this will enforce the default minimum time of 1 second between function calls
@throttle
def ...
or::
# this will enforce a custom minimum time of 2.5 seconds between function calls
@throttle(rate=2.5)
def ...
This will raise an error, because `rate=` needs to …Run Code Online (Sandbox Code Playgroud) 我想将“黑匣子”Python 函数f应用于大数组arr。额外的假设是:
f是“纯的”,例如是确定性的,没有副作用。arr具有少量唯一元素。我可以使用一个装饰器来实现这一点,该装饰器f为每个唯一元素计算arr如下:
import numpy as np
from time import sleep
from functools import wraps
N = 1000
np.random.seed(0)
arr = np.random.randint(0, 10, size=(N, 2))
def vectorize_pure(f):
@wraps(f)
def f_vec(arr):
uniques, ix = np.unique(arr, return_inverse=True)
f_range = np.array([f(x) for x in uniques])
return f_range[ix].reshape(arr.shape)
return f_vec
@np.vectorize
def usual_vectorize(x):
sleep(0.001)
return x
@vectorize_pure
def pure_vectorize(x):
sleep(0.001)
return x
# In [47]: %timeit usual_vectorize(arr)
# 1.33 s …Run Code Online (Sandbox Code Playgroud) python ×9
decorator ×4
python-2.7 ×2
python-3.x ×2
apscheduler ×1
django ×1
mypy ×1
numpy ×1
pandas ×1
pyro ×1
unique ×1
unit-testing ×1
wrapper ×1