我在网上阅读随机主题时遇到了鸭子打字这个术语,并没有完全理解它.
什么是"鸭子打字"?
如果我想使用一个需要字典或类似映射的对象的方法(参见collections.Mapping)来使用argparse.ArgumentParser()
作为Namespace
对象的结果,那么正确的方法是什么?
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 "<stdin>", line 1, in <module>
TypeError: 'Namespace' object has no attribute '__getitem__'
>>> dir(args)
['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '_ …
Run Code Online (Sandbox Code Playgroud) 有什么区别
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
Run Code Online (Sandbox Code Playgroud)
和
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这些中的第一个有时会起作用而第二个起作用,而其他时候,第二个起作用,而第一个起作用.为什么?哪一个是"正确"的方式呢?
如何可靠地确定对象是否具有numpy类型?
我意识到这个问题违背了鸭子打字的哲学,但是想法是确保一个函数(使用scipy和numpy)永远不会返回一个numpy类型,除非它被调用numpy类型. 这出现在另一个问题的解决方案中,但我认为确定一个对象是否具有numpy类型的一般问题远远远离它们应该分开的原始问题.
我有一个例程,它将一个字符串列表作为参数,但我想支持传入一个字符串并将其转换为一个字符串列表.例如:
def func( files ):
for f in files:
doSomethingWithFile( f )
func( ['file1','file2','file3'] )
func( 'file1' ) # should be treated like ['file1']
Run Code Online (Sandbox Code Playgroud)
我的函数如何判断字符串或列表是否已传入?我知道有一个type
功能,但是有更"pythonic"的方式吗?
注意这不是关于如何在C#中实现或模拟duck typing的问题...
几年来,我的印象是某些C#语言特性对语言本身定义的数据结构感到沮丧(这对我来说似乎总是一个奇怪的鸡蛋和鸡蛋场景).例如,我的印象是foreach
循环只能用于实现的类型IEnumerable
.
从那时起,我开始明白C#编译器使用duck typing来确定是否可以在foreach循环中使用对象,GetEnumerator
而不是查找方法IEnumerable
.这很有意义,因为它消除了鸡蛋和鸡蛋的难题.
我有点困惑,为什么这不是using
块的情况似乎并非如此IDisposable
.是否有任何特殊原因编译器不能使用duck typing并查找Dispose
方法?造成这种不一致的原因是什么?
或许还有其他东西在IDisposable的引擎盖下进行?
讨论为什么你会永远有未实现IDisposable是这个问题的范围之外的Dispose方法的对象:)
我一直看到"鸭子打字"这个短语大肆渲染,甚至还遇到了一两个代码示例.我懒得忙着做自己的研究,有人可以简单地告诉我:
通过怀疑这种"新"结构的力量,我不是故意要发怒的,而且我不会因为拒绝做研究而避开这个问题,但我正在喋喋不休地谈论我所看到的所有关于这个问题的大肆宣传.最近.它看起来像没有打字(也就是动态打字),所以我没有立即看到优势.
附录:感谢目前为止的例子.在我看来,使用类似'O-> can(Blah)'的东西相当于进行反射查找(可能并不便宜),和/或与编译器可能说的(O是IBlah)大致相同能够检查你,但后者的优点是区分我的IBlah界面和你的IBlah界面,而其他两个没有.当然,对于每种方法都有很多微小的接口会变得混乱,但是那样可以检查很多单独的方法......
...所以我再也没有得到它.在一个全新的麻袋中,它是一个梦幻般的节省时间,还是同样的老东西?需要鸭子打字的例子在哪里?
对我来说,C++模板使用了鸭子打字的想法,这是对的吗?这是否意味着模板类或方法中引用的所有泛型类型都是鸭类型?
我刚刚听说鸭子打字,我读了关于它的维基百科文章,但是我很难将这些例子翻译成Java,这真的有助于我理解.
是否有人能够给出一个明确的Java打字输入示例以及我可能如何使用它?
我想在C#中使用动态对象进行简单的鸭子打字示例.在我看来,动态对象应该具有HasValue/HasProperty/HasMethod方法,其中包含一个字符串参数,用于在尝试对其运行之前查找的值,属性或方法的名称.我试图避免尝试/捕获块,如果可能的话,更深入的反射.在动态语言(JS,Ruby,Python等)中进行鸭子输入似乎是一种常见的做法,即在尝试使用它之前测试属性/方法,然后回退到默认值或抛出受控异常.下面的例子基本上就是我想要完成的.
如果上述方法不存在,是否有人有动态的预制扩展方法来执行此操作?
示例:在JavaScript中,我可以非常轻松地测试对象上的方法.
//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}
Run Code Online (Sandbox Code Playgroud)
我如何在C#中做同样的事情?
//C# 4
dynamic Quack(dynamic duck)
{
//how do I test that the duck is not null,
//and has a quack method?
//if it doesn't quack, return null
}
Run Code Online (Sandbox Code Playgroud) duck-typing ×10
python ×3
c# ×1
c#-4.0 ×1
c++ ×1
dictionary ×1
dynamic ×1
idisposable ×1
interface ×1
java ×1
list ×1
numpy ×1
ruby ×1
templates ×1
variant ×1