вызвать метод экземпляра из класса интерфейса - PullRequest
0 голосов
/ 24 октября 2019

Я ищу способ вызова метода экземпляра из другого класса, и мне стало интересно, смогу ли я / как сделать следующее

цель и контекст

Класс, который я пишуявляется формирователем данных , чей метод __rshift__ должен иметь возможность адаптировать формат данных batch к многим клиентам базы данных без необходимости изменения пользователем используемого метода. Вот как я хотел бы, чтобы метод >> вызывался

batch  = SomeExtractor(config).extract("some")
db_client = InfluxDBClient()
# this would be awesome
DataFormater(batch)>>db_client.write_points

DataFormater

class DataFormater(object): 
  def __init__(self, batch: Batch): 
    self.batch = batch

  @abstractmethod
  def __rshift__(self, db): 
    db_client = some_way_to_get_the_called_client(db)
    method = some_way_to_get_the_method(db)

    if method == InfluxDBClient.write_points:
      db_client.write_points({"measurement": self.batch.origin, 
                "time" : self.batch.date, 
                "tags": dict(zip(self.batch.dimensions_names, row["dimensions"])),
                "fields": dict(zip(self.batch.metrics_names, row["values"])}
                for row in self.batch.rows))

Погуглил мою проблему, добавил stack = inspect.stack(db) в методе __rshift__ и получилследующее, но я не уверен, как его использовать

frame = <frame at 0x7f6c2a1515c0, file '/usr/src/collector/collector.py', line 95, code __rshift__>
context = <bound method InfluxDBClient.write_points of <collector.InfluxDBClient object at 0x7f6c2a131510>>

Как я могу это сделать?

1 Ответ

0 голосов
/ 24 октября 2019

Элегантное решение, предложенное @sanyash с использованием __self__:

class DataFormater(object): 
  def __init__(self, batch: Batch): 
    self.batch = batch

  @abstractmethod
  def __rshift__(self, db_method): 
    if type(db_method.__self__) == InfluxDBClient: 
      db_method( ({"measurement": self.batch.origin,
        "time" : self.batch.date, 
        "tags": dict(zip(self.batch.dimensions_names, row["dimensions"])),
        "fields": dict(zip(self.batch.metrics_names, row["values"]))}) for row in self.batch.rows )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...