Как мне написать функцию, чтобы запустить функцию и вернуть уникально названные переменные внешней области видимости? - PullRequest
0 голосов
/ 18 мая 2019

Мне нужно запускать одну функцию несколько раз, когда 3 из 5 аргументов остаются неизменными каждый раз. Как я могу написать функцию, которая будет принимать уникальные аргументы в качестве входных данных и возвращать выходные данные внутренней функции в качестве уникальных переменных?

Функция, которую я пытаюсь запустить, является частью SQLalchemy:

sales = Table('sales', metadata, autoload=True, autoload_with=engine, schema=None)

Первый аргумент, имя таблицы, всегда отличается и также должен быть именем переменной. Последний аргумент иногда будет другим.

Моя идея состояла в том, чтобы создать словарь с именем table_name: schema_name и передать его функции, которая просматривает словарь и запускает функцию Table.

table_names = {'sales': None, 'orders': None, 'customers': 'cust_data'}

def represent_tables(tables: dict):
   for table, schema in tables:
       nonlocal exec(table)
       exec(table) = Table(table, metadata, autoload=True,
                           autoload_with=engine, schema=schema)

represent_tables(table_names)

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

1 Ответ

1 голос
/ 18 мая 2019

Как правило, вы не хотите динамически создавать переменные.Вместо этого используйте структуру данных, например, словарь.

Как написать функцию, которая будет принимать уникальные аргументы в качестве входных данных и возвращать выходные данные внутренней функции в качестве уникальных переменных?

Вы можете создать функцию, которая извлекает необходимые объекты из вашей текущей области и просто возвращает Table экземпляр:

engine = create_engine(...)
metadata = MetaData()

def create_table(name, schema=None):
    return Table(name, metadata, autoload=True, autoload_with=engine, schema=schema)

Затем вы можете создать словарь таблиц:

tables = {
    'sales': create_table('sales'),
    'orders': create_table('orders'),
    'customers': create_table('customers', schema='cust_data'),
}

Если вы хотите меньше повторений за счет читабельности, вы можете использовать словарное понимание для создания ваших таблиц из объекта, описывающего таблицы:

table_schemas = {
    'sales': None,
    'orders': None,
    'customers': 'cust_data',
}

tables = {
    name: create_table(name, schema)
    for name, schema in table_schemas.items()
}

SQLAlchemy также имеет Metadata.reflect()метод , который может быть полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...