Как программно вызвать функцию-член класса в Python? - PullRequest
0 голосов
/ 27 марта 2020

как программно вызвать функцию-член класса в Python?

Например, у меня есть класс Model в peewee с различными атрибутами метода, такими как .select(), .join(), .where() et c ...

Вот пример из документации.

query = (User
         .select(User.username, fn.COUNT(Favorite.id).alias('count'))
         .join(Tweet, JOIN.LEFT_OUTER)  # Joins user -> tweet.
         .join(Favorite, JOIN.LEFT_OUTER)  # Joins tweet -> favorite.
         .group_by(User.username))

Чтобы объединить несколько таблиц, мне нужно несколько раз вызвать метод join. Проблема в том, что я хотел бы иметь возможность назвать его n, где n - это массив ссылок, поскольку мои модели определены программно, то же самое для ссылок.

Так что это может быть что-то например:

query = (ModelA
         .select(*AllModels)
         .join(ModelB, JOIN.LEFT_OUTER, on=cond1)
         .join(ModelC, JOIN.LEFT_OUTER, on=cond2)
         .join(ModelD, JOIN.LEFT_OUTER, on=cond3)
         .join(ModelE, JOIN.LEFT_OUTER, on=cond4)

Как программно применить вызовы join, используя al oop или эквивалентный?

Для генерации списка объединений, у меня есть такая структура: ниже

schema = {
        "datasets": {
        "a74d411f-412b-42b3-aa31-a1f687e0257e": {
            "oid": "5e585118de2ecd919a50fd94",
            "fullpath": "/vob/CABC/CABC123/ad/a/ae.sas7bdat"
        },
        "067a21c5-e512-49d7-bd2c-40fbb56e6f30": {
            "oid": "5e585118de2ecd919a50fd94",
            "fullpath": "/vob/CABC/CABC123/ad/a/dm.sas7bdat"
        },
        "067a21c5-e512-49d7-bd2c-40fbb56e6f31": {
            "oid": "5e585118de2ecd919a50fd94",
            "fullpath": "/vob/CABC/CABC123/ad/a/zn.sas7bdat"
        }
        },   
        "links": [
            {
                "dataset_origin": "a74d411f-412b-42b3-aa31-a1f687e0257e",
                "column_origin": "SUBJID",
                "dataset_target":  "067a21c5-e512-49d7-bd2c-40fbb56e6f30",
                "column_target": "SUBJID",
                "join_type": "INNER"
            },
            {
                "dataset_origin": "a74d411f-412b-42b3-aa31-a1f687e0257e",
                "column_origin": "SUBJID",
                "dataset_target":  "067a21c5-e512-49d7-bd2c-40fbb56e6f31",
                "column_target": "SUBJID",
                "join_type": "INNER"
            }
        ]
    }

1 Ответ

1 голос
/ 27 марта 2020

Здесь вы можете просто сделать фолд с помощью обычного l oop например

query = ModelA.select(*AllModels)
for Model, cond in ...:
    query = query.join(Model, JOIN.LEFT_OUTER, on=cond)

Кроме того, методы доступны как любой другой атрибут, поэтому вы можете getattr(obj, method_name)(method_params...)

...