我想要做的基本想法是:
def aFuncion(string = '', dicti = {}):
if len(str) > 0:
print 'you gave string as input'
if len(dicti) > 0:
print 'you gave a dict as input'
aFunction(string = 'test')
dict['test'] = test
aFunction(dicti = dict)
我知道这种想法在更多OO类型的语言中是可能的,但在python中这也是可能的吗?
现在我正在做
def aFuncion(input):
if type(input) == str:
print 'you gave string as input'
if type(input) == dict:
print 'you gave a dict as input'
aFunction('test')
但我希望在调用函数时明确区别
答案 0 :(得分:6)
使用相同方法支持不同参数类型的想法称为multiple dispatch or multimethods。
为了得到一个很好的介绍,你可以阅读这个Guido Van Rossum article,看看PyPi,因为有一些multimethod packages可用。
答案 1 :(得分:3)
这个想要“在调用函数时要明确差异”的目标与语言的设计理念并不相符。谷歌“鸭子打字”了解更多相关信息。接受的输入应该通过函数的文档字符串清楚,这就是你需要做的。
在python中,当你想要输入它是一个字符串或一个字典时,那么你只需要编写一个代码,该代码假定输入将是一个对象,其行为方式类似于字符串或类似dict的方式。如果输入没有,那么你可以尝试如果你想要优雅地处理它,但通常你可以简单地让代码弹出一个未处理的异常。这会将球放回呼叫者的球场,以决定如何处理这种情况,或者意识到他们正在发送不良数据。
通常应该避免类型检查,如果确实需要,应该使用isinstance
而不是像你所做的那样对类型进行相等检查。这具有对继承情况更灵活的优点。
def aFuncion(input_):
if isinstance(input_, str):
print 'you gave a string-like input'
elif isinstance(input_, dict):
print 'you gave a dict-like input'
aFunction('test')
在python3中,您现在可以使用类型提示功能注释。有关该功能的详细信息,请阅读PEP 484。
答案 2 :(得分:0)
你基本上有什么用,变量声明有些麻烦。这是一个有效的宣言:
def aFunction(str = '', dicti = {}):
if len(str) > 0:
print 'you gave string as input'
if len(dicti) > 0:
print 'you gave a dict as input'
str = 'test'
dicti = dict([('test', 'test')])
aFunction(str = str)
aFunction(dicti = dicti)
aFunction(str = str, dicti = dicti)
aFunction(dicti = dicti, str = str)
提出:
you gave string as input
you gave a dict as input
you gave string as input
you gave a dict as input
you gave string as input
you gave a dict as input
您还可以将非特定参数作为列表和字典发送到函数(例如,请参阅What is a clean, pythonic way to have multiple constructors in Python?)。