根据参数

时间:2017-10-19 21:21:43

标签: python python-3.x dynamic

假设我有一些非常相似但有细微差别的函数foo_US, foo_EU, foo_JP。在main()或其他函数中,程序传递参数region,并调用其中一个foo函数。有什么不同的方法可以做到这一点,以及如何优雅/高效地完成。 我现在能想到的唯一方法是分别定义所有foo函数并使用if语句检查提供的region,然后调用相应的函数。

就像这样。

# region = 'US' # for example
if region == 'US':
    foo_US()
elif region == 'EU':
    foo_EU()
# and so on ...

但是,这需要单独声明所有foo_someRegion 是否有可能为所有foo函数声明一个基类,因此对于每个特定的foo函数,我只需要编写微小的差异(foo函数应具有相同的功能)。此外,有没有办法让一个基类country例如,然后将每个区域作为派生类,以便调用foo将导致相应的foo被调用?类似于pet基类包含catdog子类cat.speak()返回meowdog.cry()返回woof }。

如果有任何不清楚的地方,请告知我们,我们非常感谢任何指导。谢谢!

3 个答案:

答案 0 :(得分:3)

一个(在我看来)解决这个问题的好方法是使用字典

regionFunction = {
    'US': foo_US,
    'EU': foo_EU,
    ...
}
regionFunction(region)()

您建议为每个地区创建额外课程也是一种选择。选择哪种方法取决于(在我看来)你需要做多少次这种事情。 如果这是您的代码中唯一需要根据区域调用不同函数的时间,那么我建议使用字典。如果你需要更频繁地做,我建议使用课程。

答案 1 :(得分:1)

我将做一个简单的例子,但基本上你需要一个包含每个区域函数作为方法的类,然后用getattr()调用这些函数,它允许你通过名称调用类的方法字符串。

class Region(object):
    def foo_US(self):
        print('US method')

    def foo_GB(self):
        print('GB method')

    # so on...

my_region = 'foo_US'

my_region_function = getattr(Region, my_region)

my_region_function()
# >>> US method

答案 2 :(得分:1)

foo_XY函数是否需要单独定义取决于它们的作用。如果它们足够相似,您可以编写一个基础foo,它可以执行标准操作,但必要时可以覆盖它。例如:

class Region(object):

    key = None

    def foo(self):
        # Do something standard
        print(self.key)

class EURegion(Region):

    key = 'EU'

class USRegion(Region):

    key = 'US'

class WeirdRegion(Region):

    key = 'WEIRD'

    def foo(self):
        # Do something different
        print('!!!')

在脚本的主要功能中,您可以使用key动态检索指定区域:

# Elided: retrieve region key from command line
regions = {cls.key: cls for cls in Region.__subclassess__()}
region = regions[key]()
region.foo()