基于参数确定python中要使用的函数
假设我有几个函数基于参数确定python中要使用的函数,python,python-3.x,dynamic,Python,Python 3.x,Dynamic,假设我有几个函数foo_-US,foo_-EU,foo_-JP,它们非常相似,但有一些细微的区别。在main()或某些其他函数中,向程序传递一个参数region,并调用一个foo函数。有哪些不同的方法可以做到这一点,以及如何优雅/高效地做到这一点。 我现在能想到的唯一方法是分别定义所有foo函数,并使用if语句检查提供的区域,然后调用相应的函数 像这样 # region = 'US' # for example if region == 'US': foo_US() elif regio
foo_-US,foo_-EU,foo_-JP
,它们非常相似,但有一些细微的区别。在main()
或某些其他函数中,向程序传递一个参数region
,并调用一个foo
函数。有哪些不同的方法可以做到这一点,以及如何优雅/高效地做到这一点。
我现在能想到的唯一方法是分别定义所有foo
函数,并使用if
语句检查提供的区域,然后调用相应的函数
像这样
# region = 'US' # for example
if region == 'US':
foo_US()
elif region == 'EU':
foo_EU()
# and so on ...
但是,这需要单独声明所有的foo\u someRegion
。
是否有可能为所有的foo
函数声明一个基类,因此对于每个特定的foo函数,我只需要编写细微的差异(foo函数应该具有相同的功能)。此外,是否有一种方法可以让基类country
,然后将每个区域作为派生类,这样调用foo将导致调用相应的foo?有点类似于拥有一个带有cat
和dog
子类的pet
基类,其中cat.speak()
返回meow
和dog.cry()
返回woof
如果有任何不清楚的地方,请告诉我,并感谢您的指导。谢谢大家! (在我看来)解决这个问题的一个好办法是使用字典
regionFunction = {
'US': foo_US,
'EU': foo_EU,
...
}
regionFunction(region)()
您建议为每个区域创建一个额外的类也是一个选项。选择哪种方法取决于(同样,在我看来)你需要做这种事情多少次。
如果这是代码中唯一一次需要根据区域调用不同函数,那么我建议使用字典。如果你需要更频繁地使用它,我建议你使用类。在我看来,解决这个问题的一个好方法就是使用字典
regionFunction = {
'US': foo_US,
'EU': foo_EU,
...
}
regionFunction(region)()
您建议为每个区域创建一个额外的类也是一个选项。选择哪种方法取决于(同样,在我看来)你需要做这种事情多少次。
如果这是代码中唯一一次需要根据区域调用不同函数,那么我建议使用字典。如果您需要更频繁地执行此操作,我建议使用类。我将给出一个简单的示例,但基本上您需要一个类,该类将包含每个区域函数作为方法,然后使用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
我将给出一个简单的示例,但基本上您需要一个类,该类将包含每个区域函数作为一个方法,然后使用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
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('!!!')
在脚本的主函数中,可以使用键动态检索指定区域:
# Elided: retrieve region key from command line
regions = {cls.key: cls for cls in Region.__subclassess__()}
region = regions[key]()
region.foo()
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('!!!')
在脚本的主函数中,可以使用键动态检索指定区域:
# Elided: retrieve region key from command line
regions = {cls.key: cls for cls in Region.__subclassess__()}
region = regions[key]()
region.foo()
这仍然需要一个接一个地定义每个区域函数?我认为您的输入错误是:'EU':foo_EU
而不是'EU':foo_US
@AsheKetchum是的。如果函数基本相同,您可能可以将它们的共同代码提取到一个额外的函数中。顺便说一句,您建议为每个区域编写一个类也可能是合适的(特别是如果您遇到必须根据区域多次调用不同函数的问题)this@tehforsch你提出了一个有趣的观点。因为它需要每天运行,所以每周7次呼叫它是否应该被视为“被呼叫了更多次”而不是一周运行一次,但在一次运行中调用7次?@AsheKetchum这不是你调用它的频率的问题,而是这种想法在你的代码中使用的频率的问题-如果这种情况发生不止一次,你可能想通过,例如,为每个区域实现一个类仍然需要一个接一个地定义每个区域函数吗?我认为您有一个输入错误:'EU':foo_EU
而不是'EU':foo_US
@AsheKetchum Yes。如果函数基本相同,您可能可以将它们的共同代码提取到一个额外的函数中。顺便说一句,您建议为每个区域编写一个类也可能是合适的(特别是如果您遇到必须根据区域多次调用不同函数的问题)this@tehforsch你提出了一个有趣的观点。因为它需要每天运行,所以每周7次呼叫它是否应该被视为“被呼叫了更多次”而不是一周运行一次,但在一次运行中调用7次?@AsheKetchum这不是你调用它的频率的问题,而是这种想法在你的代码中使用的频率的问题-如果这种情况发生不止一次,你可能想通过,例如,为每个regionI实现一个类需要考虑这个问题。不确定是否为了自动生成每个区域的函数而简化了问题完全取决于函数中的代码、有多少代码重复以及以何种方式重复,但可以