Как включить макросы в Python?



Это похожий вопрос, но моя цель-не производительность, а читаемость.



Предположим, у меня есть разные Behaviours, и они разделяют повторяющуюся функцию f1().

from abc import ABCMeta, abstractmethod

class Behavior:
__metaclass__ = ABCMeta
@abstractmethod
def run(self):
pass

class Behavior1(Behavior):
def __init__(self, data):
self.data = data

def run(self):
def f1():
print(self.data*localVar)

localVar = 1.
f1()

class Behavior2(Behavior):
def __init__(self, data):
self.data = data

def run(self):
def f1():
print(self.data*localVar)

localVar = 2.
f1()

class Behavior3(Behavior):
def __init__(self, data):
self.data = data

def run(self):
def f1():
print(self.data*localVar)

localVar = 3
f1()


Я хочу, чтобы f1() имел доступ к атрибутам экземпляра и локальным переменным внутри run(), не передавая их в качестве аргументов.



Вероятно, я могу реализовать это внутри Behavior, но у меня нет доступа к localVar.



from abc import ABCMeta, abstractmethod

class Behavior:
__metaclass__ = ABCMeta
@abstractmethod
def run(self):
pass

def f(self):
print(self.data*localVar)

class Behavior1(Behavior):
def __init__(self, data):
self.data = data

def run(self):
def f1():
print(self.data*localVar)

localVar = 1.
f1()
self.f()

class Behavior2(Behavior):
def __init__(self, data):
self.data = data

def run(self):
def f1():
print(self.data*localVar)

localVar = 2.
f1()
self.f()

class Behavior3(Behavior):
def __init__(self, data):
self.data = data

def run(self):
def f1():
print(self.data*localVar)

localVar = 3
f1()
self.f()


Существует ли какой-либо питонский или ООП способ написания макроса в стиле C для f1()?

657   2  

2 ответов:

Макросы не являются неотъемлемой конструкцией в python, так как в нем нет препроцессора, подобного C++.

Таким образом, все, что вы делаете, чтобы позволить вам написать код только один раз, должно быть сделано...

  • Вне python (то есть вы вручную используете препроцессор gcc); или

  • С помощью отладочной информации в Python (т. е. разделить стек вызова)

Бывший-это боль в заднице, но это выполнимо.

Последнее тоже боль в приклад, но тоже выполнимо.

Однако, поскольку ваша цель-повысить читабельность, ни один из этих вариантов не хорош, потому что любой, кто привык к python, не будет иметь абсолютно никакого представления о том, что вы делаете. Будьте очень осторожны при переносе языковых конструкций из других языков в python.

Если ваша функция нуждается в модификации локальных переменных, то вам придется писать одни и те же строки кода в каждом месте.

Если вам просто нужно их использовать, я настоятельно рекомендую просто передайте аргументы - или переосмыслите свой дизайн и потребность во многих производных классах, которые делают примерно одно и то же в одной функции (например, что если вы разбили эту "функцию" на несколько частей функции и позволили производным классам переопределить только те, которые они хотят?).

То, что вы на самом деле хотите, звучит как "доступ к внешним переменным области", которые не являются глобальными.

Если вы используете python3.x, вы должны найти нелокальное ключевое слово .

Если вы используете python2.x, попробуйте использовать изменяемый объект в качестве оболочки для вашего объекта.

На самом деле мой ответ основан на этом.

Comments

    Ничего не найдено.