0

基本的に、クラス Foo() にいくつかのメソッド Foo.bar(arg1, name) を提供する API があります。

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

必ずしもコンテキストマネージャーが必要だとは思いません。代わりに functools のパーシャルを使用できます。

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

「コンテキストを切り替える」場合は、次のように再定義し_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 に答える