问题标签 [duck-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python和字典之类的对象
我需要一个用于字典的 python 3.1 深度更新函数(一个将递归更新父字典内的子字典的函数)。
但我认为,在未来,我的函数可能不得不处理行为像字典但不是的对象。此外,我想避免使用isinstance
and type
(因为它们被认为是不好的,因为我几乎可以在每个 Pythonista 的博客上阅读)。
但是鸭子类型是 Python 哲学的一部分,那么我如何检查一个对象是否类似于字典呢?
谢谢!
编辑:谢谢大家的回答。以防万一,我编写的函数可以在这个地方找到:http: //blog.cafeaumiel.com/public/python/dict_deep_update.py
c# - Silverlight 的鸭子类型库?
Silverlight是否有任何鸭子类型库?有一些成熟的 .NET 框架,但我正在寻找更轻的东西。
.net - 无类型的 .net 数据集是鸭子类型的 DTO 吗?
好的,我正在使用索引器访问数据集中数据行的字段,但让我们认为这只是一个语法特征。您是否会走到这一步,称它为简化为 getter 和 setter 的鸭子类型的东西,换句话说,是数据传输对象?
dry - 鸭子打字:你会如何对待这种情况
相对较新的python。我最近发布了一个关于验证数据类型是否为布尔值的问题。[对多个属性使用描述符(编辑:不是单个装饰器)?
给出的答案参考了鸭子打字。我有一个简单的例子,并想确保我理解。如果我的代码是:
如果我对鸭子类型的理解有些正确,那么在上面的类中,我相信bool1 将始终是一个布尔值:我不应该检查 bool1 == False 还是 bool1 == True。当有人不正确地使用我的模块时,即 bool1 = None,该方法会执行一些我不希望在没有指示存在问题的情况下执行的操作......并且火箭飞船上的人死了。
我可以编写代码以确保 bool1 始终是真正的布尔值的另一种方法是(上面链接中的 BooleanDescriptor 的学分!):
我是否理解第一种方式(不检查)是正确的方式?我的意思是,我总是可以在第一个示例中明确地将代码编写为:
但是,如果我在使用 bool1 的每一种方法等中都这样做,那我到底为什么不首先验证 bool1 是一个真正的布尔值(DRY!)!?!?:-)
谢谢!
保罗
ruby - 在 Ruby 中实现 to_int 和 to_str 的后果
我有一个公开字符串值和 int 值的类(分别是命令输出和退出代码)。除了通过to_s
and暴露它们之外to_i
,我还使用to_str
and to_int
,如下所示:
我的想法是能够在尽可能多的情况下使用这个对象。将其强制转换为字符串或 int 会增加可用性。例如,我可以将对象与字符串连接起来:
(我想以此作为 int 强制的示例,但 Fixnum.+ 不喜欢它,因此它实际上不起作用:)
到目前为止,我所读到的所有内容都表明这可能是一件“坏”的事情。共同的主题是这样的:“当您的对象可以表示为字符串/int,但/仅当您的对象基本上to_s
是字符串/int 时使用/ ”。to_i
to_str
to_int
毫无疑问,我的课程“根本上”不是字符串或整数。但是我对这条规则有一些问题:
- 它使我的课程不那么灵活/可用。例如:如果我没有 Status.to_str,我无法使用 String.+ 将 Status 输出与另一个字符串连接起来。
- 这似乎违反了鸭式打字的精神。对象的用户(即:将其作为参数获取的方法)不应该关心该对象是什么,而应该只关心它可以做什么。(在这种情况下,“do”表示“可以表示为字符串/int”。)
- “基本上是一个字符串/整数”的论点对我来说非常模糊。例如,您会看到
Float.to_int
很多人提到了这一点。故事是这样的,因为浮点数总是有一个整数部分,to_int
是一种有效的方法。但是,我认为这是虚假的:浮点数不是整数(因为它具有非整数分量),因此试图将它们的“类型”等同起来没有多大意义。您可以合法地将浮点数转换为整数(通过截断),但我可以说我也可以将状态转换为整数(通过“截断”所有非退出代码信息)。
所以,我的问题是:实施and是否有任何真正的(即:实际的)危害?to_str
to_int
更新:Jörg W Mittag 举了一个让我想到一些事情的例子。换个说法:当你已经拥有/时,真的需要拥有to_str
/吗?(除了特定方法已经期待结束的事实之外)to_int
to_s
to_i
to_str
to_s
例如,在 Jörg 的 Array.join 示例中,数组成员通过 to_s 转换,而分隔符通过 to_str 转换。但这真的有必要吗?如果 Array.join 改为调用 separator.to_s,那么您可以成功地将更多对象传递给它(例如:整数、符号等)并获得更大的灵活性。Ruby 是否从这种分离中受益?
duck-typing - “鸭子打字”的词源?
“鸭子打字”这个名字背后有什么故事吗,我听说过“如果它看起来像鸭子,听起来像鸭子,我们就叫它鸭子”(或类似的东西),但为什么鸭?为什么不“如果它看起来像_,听起来像_,我们就叫它_”。
这听起来像一个飞行马戏团的草图,但我不记得了。这个名字背后有故事吗?
objective-c - Objective-C 继承方法匹配
我遇到了一个与 Objective-C 中的类继承相关的奇怪场景。
假设我有三个类 A、B 和 C,它们继承自基类 X。类 A、B 和 X 具有构造函数:
唯一的区别是每个类对委托使用不同的协议。
发生的情况是,对于 A 和 B,编译器尝试使用 C 中的方法。警告通知我,提供的委托未实现类 C 的构造函数所需的协议。委托本身没有任何问题,因为每个类都有一个委托,该委托为类自己的构造函数实现了正确的协议。运行时一切正常,所有类都调用了正确的函数。
我尝试让构造函数返回 A*、B* 或 C* 而不是匿名 id,但这仍然不能解决问题。
唯一有效的方法是像这样对正确的类进行强制转换:
这似乎是多余和不必要的。我可能在这里遗漏了一些明显的东西。
language-design - 鸭子打字,必须是动态的吗?
维基百科曾经说过*关于鸭子打字:
在使用面向对象编程语言的计算机编程中,鸭子类型是一种动态类型,其中对象的当前方法和属性集确定有效语义,而不是从特定类或特定接口的实现继承。
(* 编者注:自发布此问题以来,维基百科文章已被编辑以删除“动态”一词。)
它说的是结构类型:
结构类型系统(或基于属性的类型系统)是类型系统的主要类,其中类型兼容性和等价性由类型的结构决定,而不是通过显式声明。
它将结构子类型与鸭子类型进行对比:
[结构系统] 与 ... 鸭子类型形成对比,其中只检查在运行时访问的结构部分的兼容性。
然而,在我看来, duck-typing一词至少直观地包含了结构子类型系统。事实上维基百科说:
概念的名称 [duck-typing] 指的是鸭子测试,归因于 James Whitcomb Riley,它可以表述如下:“当我看到一只鸟儿像鸭子一样走路、像鸭子一样游泳、像鸭子一样嘎嘎叫时,我称那只鸟为鸭子。”
所以我的问题是:为什么我不能将结构子类型称为鸭子类型?是否甚至存在不能被归类为鸭子类型的动态类型语言?
后记:
正如 reddit.com 上一个叫daydreamdrunk的人如此雄辩地说: “如果它像鸭子一样编译并像鸭子一样链接......”
后记
许多答案似乎基本上只是重复我在这里已经引用的内容,而没有解决更深层次的问题,这就是为什么不使用术语鸭子类型来涵盖动态类型和结构子类型?如果您只想谈论鸭子类型而不是结构子类型,那么就称它为:动态成员查找。我的问题是,鸭子打字这个词对我没有任何意义,这只适用于动态语言。
.net - .NET 中的泛型和 Duck-Typing XML?
我正在处理数据实例的一些 XML 表示。我正在使用 .NET 序列化反序列化对象,但是我的灵魂中的某些东西因必须编写类来表示 XML 而感到不安……下面是我想做的事情,但我不知道语法是否正确甚至是可能的:
考虑以下:
对此方法有什么建议吗?