Python 函数 - 将完整的 if 条件作为参数传递

Python functions - pass a full if condition as a parameter

是否可以在 Python 中仅在必要时将特定条件作为参数传递给函数?例如:完整的 if 条件:

  # /!\ checking if customer_name is NULL (NOT NULL field in destination database)
  if row['customer_name'] == NULL:
    row['customer_name'] = row['contact_name']

我正在编写一个脚本,它将自动将数据从 mysql 迁移到 postgresql。一些表在两个数据库(源和目标)中具有相同的结构,其他的在结构上不同,而其他的只是数据类型不同。

我正在尝试了解是否可以 "inject" 函数内的条件,以便对上一段中提到的所有 3 种情况使用相同的代码段条件会有所不同每次。

下面是一个示例(我正在研究注入可能性的代码段是黄色的->将其作为参数传递):

def migrate_table(select_query, insert_query, tmp_args):
  # Cursors initialization
  cur_psql = cnx_psql.cursor()

  cur_msql.execute(select_query)

  args = []
  for row in cur_msql:

    # /!\ checking if customer_name is NULL (NOT NULL field in destination database)
    if row['customer_name'] == NULL:
      row['customer_name'] = row['contact_name']
      args.append(cur_psql.mogrify(tmp_args, row))
    args_str = ','.join(args)

  if len(args_str) > 0:
    try:
      cur_psql.execute(insert_query + args_str)
    except psycopg2.Error as e:
      print "Cannot execute that query", e.pgerror
      sys.exit("Leaving early this lucky script")

  ## Closing cursors
  cur_psql.close()

实际上我是这样调用函数的:

migrate_compatable(
"SELECT customer_id, customer_name, contact_name, address, city, postal_code, country FROM mysqlcustomers",
"INSERT INTO psqlcustomers (customer_id, customer_name, contact_name, address, city, postal_code, country"
"(%(customer_id)s, %(customer_name)s, %(contact_name)s, %(address)s, %(city)s, %(postal_code)s, %(country)s)"
)

我想知道是否可以添加一个接受完整条件输入的参数

根据@jonrsharpe 的建议,您可以修改 migrate_table 函数以传递您将使用 row:

调用的检查函数
def check_customer_name(row):
    if row['customer_name'] == NULL:
        row['customer_name'] = row['contact_name']
    return row

然后在migrate_table:

def migrate_table(..., check_function = None):
    ...
    if callable(check_function):
        row = check_function(row)
    ...

你的电话会变成:

migrate_table("...long sql query...", "...", check_customer_name)

您可以创建任意数量的检查函数来测试您的条件。