Python borg проблема шаблона

Знаете ли вы, что вы можете получить тот же результат без if then else?

См. Это:

fn_plotly<-function(fn_data,fn_x,fn_y){


    p<-plotly::plot_ly(data = fn_data, x =~ fn_data[[fn_x]],type="scatter", color=fn_data[,fn_y])

  return(p)

}

fn_plotly(iris,"Sepal.Length",NULL)
fn_plotly(iris,"Sepal.Length","Species")
7
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Похоже, что он работает слишком хорошо: -)

Проблема в том, что назначение self .__ myvalue = "" в __ init __ всегда будет сбивать значение myvalue каждый раз, когда создается новый Borg. Вы можете увидеть это, если добавите некоторые дополнительные операторы печати в свой тест:

conf = Config()
conf.myvalue("Hello")
print conf.myvalue()  # prints Hello
conf2 = Config()
print conf.myvalue()  # prints nothing
print conf2.myvalue() # prints nothing

Удалите self .__ myvalue и все будет хорошо.

Сказав это, реализация myvalue ( ) немного странно. Лучше, я бы сказал, иметь явные методы получения и установки с использованием свойств. Вам также потребуется некоторый код в __ init __ для инициализации значения myvalue , если он еще не существует, или, по крайней мере, для обработки того, что он может не существовать в получателе. Возможно что-то вроде:

class Config(object):
    """
    Borg singleton config object
    """
    _we_are_one = {}

    def __init__(self):
        #implement the borg pattern (we are one)
        self.__dict__ = self._we_are_one

    def set_myvalue(self, val):
        self._myvalue = val

    def get_myvalue(self):
        return getattr(self, '_myvalue', None)

    myvalue = property(get_myvalue, set_myvalue)

c = Config()
print c.myvalue # prints None
c.myvalue = 5
print c.myvalue # prints 5
c2 = Config()
print c2.myvalue #prints 5
13
ответ дан 6 December 2019 в 10:03
поделиться

Объединение удаления self .__ myvalue = "" с новым стилем Борг и предложения, которых следует избегать __ в именах переменных, мы получаем:

class Config(object):
    """
    Borg singleton config object
    """
    _we_are_one = {}
    _myvalue = ""

    def __new__(cls, *p, **k):
        self = object.__new__(cls, *p, **k)
        self.__dict__ = cls._we_are_one
        return self

    def myvalue(self, value=None):
        if value:
           self._myvalue = value
        return self._myvalue

if __name__ == '__main__':
    conf = Config()
    conf.myvalue("Hello")
    conf2 = Config()
    print conf2.myvalue()
4
ответ дан 6 December 2019 в 10:03
поделиться

Проблема в том, что init () сбрасывает myvalue в пустую строку. Когда я удаляю эту строку, я получаю ожидаемый результат.

1
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: