Вы можете использовать несвязанные методы, а не создавать свои собственные функции ,
В ваших первых двух примерах вы, вероятно, захотите str.upper
и str.lower
. (Если вам необходимо поддерживать более str
, вы могли бы использовать operator.methodcaller("upper")
или подобное, но имейте в виду, что это почти наверняка плохое дизайнерское решение, чтобы иметь дело с обоими str
и bytes
объектов с тем же кодом!)
Ваш третий пример сложнее. Если вам нужен только один объект a
, вы должны указать его, и он будет работать так же, как и примеры str
(например, A.foo
). Аналогично, если значение b
является постоянным и известно заранее, вы можете использовать operator.methodcaller("foo", b)
, чтобы получить вызываемый код, который вызывает a.foo(b)
для данного значения a
, но это не помогает, если b
также является переменной.
Если вы не знаете a
или b
заранее, вам действительно нужно придерживаться функции.Если вам не нравится, как лямбда-выражение выглядит, вы можете использовать обычное def
заявление:
def foo(a, b):
return a.foo(b)
Если это то, что вы часто используете, вы можете написать свой собственный вариант на methodcaller
производить функции по требованию:
def my_methodcaller(method_name):
def inner(obj, *args, **kwargs):
return getattr(obj, method_name)(*args, **kwargs)
return inner
Затем вы должны использовать foo = my_methodcaller("foo")
.
Зачем вам это нужно? Я не помню, чтобы когда-либо использовал такой шаблон, и у меня есть опыт. Может быть, есть лучший подход. –
Я бы не назвал это шаблоном; единственное, что вы повторно используете, - это ключевое слово lambda. Вы можете использовать 'operator.methodcaller()' или 'functools.partial()', но вы не сохраните себе никаких символов при определении этих объектов. –
один способ не использовать его вообще, не уверен, что я понял его. –