标签: duck-typing

什么是鸭子打字?

我在网上阅读随机主题时遇到了鸭子打字这个术语,并没有完全理解它.

什么是"鸭子打字"?

programming-languages duck-typing

388
推荐指数
7
解决办法
11万
查看次数

将Python argparse.Namespace()作为字典处理的正确方法是什么?

如果我想使用一个需要字典或类似映射的对象的方法(参见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)

python dictionary duck-typing

201
推荐指数
2
解决办法
11万
查看次数

Ruby类类型和case语句

有什么区别

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)

出于某种原因,这些中的第一个有时会起作用而第二个起作用,而其他时候,第二个起作用,而第一个起作用.为什么?哪一个是"正确"的方式呢?

ruby duck-typing case-statement

127
推荐指数
4
解决办法
4万
查看次数

如何识别python中的numpy类型?

如何可靠地确定对象是否具有numpy类型?

我意识到这个问题违背了鸭子打字的哲学,但是想法是确保一个函数(使用scipy和numpy)永远不会返回一个numpy类型,除非它被调用numpy类型. 这出现在另一个问题的解决方案中,但我认为确定一个对象是否具有numpy类型的一般问题远远远离它们应该分开的原始问题.

python duck-typing numpy dynamic-typing

80
推荐指数
6
解决办法
9万
查看次数

如何判断python变量是字符串还是列表?

我有一个例程,它将一个字符串列表作为参数,但我想支持传入一个字符串并将其转换为一个字符串列表.例如:

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"的方式吗?

python duck-typing list

61
推荐指数
7
解决办法
5万
查看次数

鸭子在C#编译器中输入

注意不是关于如何在C#中实现或模拟duck typing的问题...

几年来,我的印象是某些C#语言特性对语言本身定义的数据结构感到沮丧(这对我来说似乎总是一个奇怪的鸡蛋和鸡蛋场景).例如,我的印象是foreach循环只能用于实现的类型IEnumerable.

从那时起,我开始明白C#编译器使用duck typing来确定是否可以在foreach循环中使用对象,GetEnumerator而不是查找方法IEnumerable.这很有意义,因为它消除了鸡蛋和鸡蛋的难题.

我有点困惑,为什么这不是using块的情况似乎并非如此IDisposable.是否有任何特殊原因编译器不能使用duck typing并查找Dispose方法?造成这种不一致的原因是什么?

或许还有其他东西在IDisposable的引擎盖下进行?

讨论为什么你会永远有未实现IDisposable是这个问题的范围之外的Dispose方法的对象:)

c# compiler-construction idisposable duck-typing

61
推荐指数
2
解决办法
4967
查看次数

鸭子打字与旧的"变种"类型和/或界面有何不同?

我一直看到"鸭子打字"这个短语大肆渲染,甚至还遇到了一两个代码示例.我懒得忙着做自己的研究,有人可以简单地告诉我:

  • 'duck type'和old-skool'变体类型'之间的区别,和
  • 提供一个示例,我可能更喜欢鸭子打字而不是变种打字,以及
  • 提供一个我必须使用duck typing来完成的事情的例子?

鸭子打字图由礼貌登记

通过怀疑这种"新"结构的力量,我不是故意要发怒的,而且我不会因为拒绝做研究而避开这个问题,但我正在喋喋不休地谈论我所看到的所有关于这个问题的大肆宣传.最近.它看起来像没有打字(也就是动态打字),所以我没有立即看到优势.

附录:感谢目前为止的例子.在我看来,使用类似'O-> can(Blah)'的东西相当于进行反射查找(可能并不便宜),和/或与编译器可能说的(O是IBlah)大致相同能够检查你,但后者的优点是区分我的IBlah界面和你的IBlah界面,而其他两个没有.当然,对于每种方法都有很多微小的接口会变得混乱,但是那样可以检查很多单独的方法......

...所以我再也没有得到它.在一个全新的麻袋中,它是一个梦幻般的节省时间,还是同样的老东西?需要鸭子打字的例子在哪里?

duck-typing interface variant

43
推荐指数
3
解决办法
3730
查看次数

C++模板和duck typing之间的关系是什么?

对我来说,C++模板使用了鸭子打字的想法,这是对的吗?这是否意味着模板类或方法中引用的所有泛型类型都是鸭类型?

c++ templates duck-typing

41
推荐指数
5
解决办法
7338
查看次数

用Java打字的例子是什么?

我刚刚听说鸭子打字,我读了关于它的维基百科文章,但是我很难将这些例子翻译成Java,这真的有助于我理解.

是否有人能够给出一个明确的Java打字输入示例以及我可能如何使用它?

java duck-typing

35
推荐指数
4
解决办法
2万
查看次数

用C#4对动态物体进行鸭型测试

我想在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 dynamic c#-4.0

32
推荐指数
2
解决办法
1万
查看次数