对我来说,C ++模板使用了鸭子打字的想法,对吗? 是否意味着模板类或方法中引用的所有generics都是鸭子types?
注意:这不是一个关于如何在C#中实现或模拟鸭子打字的问题。 几年来,我的印象是某些C#语言特性在语言本身定义的数据结构上是压缩的(对我来说,这总是看起来像一个奇怪的鸡鸡蛋)。 例如,我的印象是, foreach循环只能用于实现IEnumerabletypes。 从那时起我就开始理解C#编译器使用鸭子打字来确定一个对象是否可以在foreach循环中使用,寻找一个GetEnumerator方法而不是IEnumerable 。 这消除了鸡蛋和鸡蛋的难题,这很有意义。 我有点困惑,为什么这不是似乎与using块和IDisposable的情况下。 编译器是否有任何特殊原因不能使用鸭子打字和查找Dispose方法? 这种不一致的原因是什么? 也许在IDisposable的背后还有其他的东西呢? 讨论为什么你有一个Dispose方法没有实现IDisposable的对象超出了这个问题的范围:)
我有一个例程,将string列表作为参数,但我想支持传递单个string并将其转换为一个string的列表。 例如: def func( files ): for f in files: doSomethingWithFile( f ) func( ['file1','file2','file3'] ) func( 'file1' ) # should be treated like ['file1'] 我的函数如何判断一个string还是一个列表已经被传入? 我知道有一个type函数,但是有一个“更pythonic”的方式?
如果我想使用argparse.ArgumentParser() (它是一个Namespace对象argparse.ArgumentParser()的结果和一个需要字典或类似映射的对象(请参阅collections.Mapping )的方法,那么正确的方法是什么? C:\>python Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win 32 Type "help", "copyright", "credits" or "license" for more information. >>> import argparse >>> args = argparse.Namespace() >>> args.foo = 1 >>> args.bar = [1,2,3] >>> args.baz = 'yippee' >>> args['baz'] Traceback (most recent call last): File […]
我在网上阅读软件随机主题时遇到了鸭子打字这一术语,并没有完全理解它。 什么是“鸭子打字”?