0

基本上,我有一个 api,它为类 Foo() 提供了一些方法 Foo.bar(arg1, name)。

有没有办法在上下文管理器中将 functools.partial 对象应用于 Foo.bar ,即像这样:

x=Foo()
with my_argument(name="Something") as e:
    x.bar(arg1=5) # == x.bar(arg1=5, name="Something") in this context

我想知道除了猴子修补 Foo.bar 是否有更优雅的方法?

编辑: 关键是,我有这样的代码:

model.addConstr(a, name="constraint_1")
model.addConstr(b, name="constraint_2")

如果没有额外的样板,下面的代码应该对“模型”产生相同的调用:

with Arguments(name="constraint"):
    model.addConstr(a)
    model.addConstr(b)
4

3 回答 3

2

I don't think you necessarily need the context manager, you can use partial from functools instead:

from functools import partial
x=Foo()
_xbar = partial(x.bar, name="something")
_xbar(arg1=5)

When you want to "switch context", just redifine _xbar:

_xbar = partial(x.bar, name="some other thing")
于 2012-03-27T16:50:39.997 回答
2
class Argumentor(object):
  def __init__(self, *args, **kwargs):
    self.args = args
    self.kwargs = kwargs

  def __enter__(self):
    return self

  def __exit__(self, exc_type, exc_val, exc_tb):
    pass

  def __call__(self, func, *args, **kwargs):
    newargs = args + self.args
    newkwargs = kwargs.copy()
    newkwargs.update(self.kwargs)
    return func(*newargs, **newkwargs)

def foo(num, name):
  print num, name

with Argumentor(name='bar') as f:
  f(foo, 42)
于 2012-03-27T16:51:19.173 回答
1

不是那样的,不。您的my_argument班级应该如何知道它可以在x.bar没有您传递的情况下使用?__enter__()在这种情况下,具体的做法和__exit__()方法是什么my_argument

我不明白你为什么不只是functools.partial为它制作一个对象x.bar并使用它。

于 2012-03-27T16:47:35.983 回答