Вы можете использовать встроенную функцию type()
для определения типа функции.
Скажем, если вы хотите проверить, содержит ли определенное имя строковые данные, вы можете сделать это:
if type(this_is_string) == type('some random string'):
# this_is_string is indeed a string
Так что в вашем случае вы можете сделать это так:
options = { 'some string' : string_function,
(float)(123.456) : float_function,
(int)(123) : int_function
}
def call_option(arg):
# loop through the dictionary
for (k, v) in options.iteritems():
# if found matching type...
if type(k) == type(arg):
# call the matching function
func = option[k]
func(arg)
Тогда вы можете использовать это так:
call_option('123') # string_function gets called
call_option(123.456) # float_function gets called
call_option(123) # int_function gets called
У меня нет интерпретатора Python поблизости, и я не очень много программирую на Python, поэтому могут быть некоторые ошибки, но вы должны понять это.
РЕДАКТИРОВАТЬ: В соответствии с предложением @ Адама, есть встроенные константы типа, которые вы можете проверить напрямую, поэтому лучший подход будет:
from types import *
options = { types.StringType : string_function,
types.FloatType : float_function,
types.IntType : int_function,
types.LongType : long_function
}
def call_option(arg):
for (k, v) in options.iteritems():
# check if arg is of type k
if type(arg) == k:
# call the matching function
func = options[k]
func(arg)
А поскольку сам ключ сопоставим со значением функции type (), вы можете просто сделать это:
def call_option(arg):
func = options[type(arg)]
func(arg)
Что более элегантно :-) за исключением некоторой проверки ошибок.
EDIT: А после поддержки ctypes я обнаружил, что ctypes. [Type_name_here] фактически используется как классы. Так что этот метод все еще работает, вам просто нужно использовать классы типов ctypes.c_xxx.
options = { ctypes.c_long : c_long_processor,
ctypes.c_ulong : c_unsigned_long_processor,
types.StringType : python_string_procssor
}
call_option = lambda x: options[type(x)](x)