首页 > 解决方案 > 如何在python中使用配置文件中的函数?

问题描述

我有一个 yaml 配置文件,如下所示:

---

tables:

  - table: my_table
    db: my_user
    checks:
      - type: my_check
        column: [col1, col2, col3, col4, col5]

我正在阅读此配置文件并根据yaml 中的检查部分运行检查。

假设我有一个如下所示的类:

class MasterCheck(object):

    def my_check(self, over_view_table, columns, label):
        if columns is None:
            null_check = set(over_view_table[(over_view_table['null_share'] > 0) | (
                over_view_table['empty_string_share'] > 0)].column_)
        else:
            null_check = set(over_view_table[(over_view_table['null_share'] > 0) | (
                over_view_table['empty_string_share'] > 0)].column_).intersection(set(columns))
        if len(null_check) > 0:
            self.alert = '{0}: NULLs in {1}'.format(label, null_check)
        else:
            self.alert = ""

我可以使用以下方法运行此检查:

my_check = checks['type'][0]['type']
getattr(MasterCheck(), my_check)(table_summary, column, table)

这个想法是根据配置文件中指定的内容自动运行检查。但是,可以从配置文件中为每个表提供多个检查,并且我事先不知道配置文件中的字符串是否是该类的属性。有什么推荐的方法可以在不知道该属性属于哪个类的情况下从配置文件中实例化我的检查。这方面的任何想法都会有所帮助。

标签: python-3.xyaml

解决方案


你的配置文件说:

  - type: my_check
  1. 您可以选择让它明确地说“类型:MasterCheck.my_check”。
  2. 您可以创建一个类列表(或实例化对象),然后getattr对所有类运行搜索循环,直到找到my_check.
  3. 您可以使用混合模式来做同样的事情,其中MasterCheck​​继承自多个类,每个类都提供唯一命名的函数。

例如:

class MasterCheck(NullCheck, FkCheck, SpellCheck):

这些类中的每一个都提供一个或多个功能,例如my_check,可以出现在您的配置文件中。(如果你不让函数名在类之间保持唯一,那么 python 的 mro,方法解析顺序,将选择一个赢家。)


推荐阅读