问题标签 [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 - 动态语言 IDE 中的自动完成,特别是 PyDev 中的 Python
我是 Python 新手,具有静态类型语言的背景,包括大量 Java。
在检查了特性/受欢迎程度等之后,我决定将 Eclipse 中的 PyDev 作为 IDE。
我很震惊,自动完成功能似乎不适用于内置插件。例如,如果我在数据文件上尝试自动完成:
数据文件=打开(目录+“/”+帐户,'r')数据文件。
没有建议有用的方法(例如 realines)。只有call之类的东西。
我习惯于通过跳入类定义并使用大量自动完成来快速查看类将做什么来学习一门语言。我的 PyDev '解释器' 用'强制内置' 设置得很好。
是否可以使用 PyDev 为内置函数自动完成?我是否错误地接近 IDE,即应该有一个解释器在旁边运行并用它测试东西?到目前为止,IDE 似乎很弱,例如 2 分钟后,我的新 Mac 上出现了 IDLE 段错误。我很想知道有经验的 Python 开发人员在探索不熟悉的(内置)模块时会做什么,因为这让我重新考虑我最初对 Python 的吸引力。我喜欢一种可以通过轻松探索来学习的语言!
谢谢,
python - 如何要求在 Python 中实现方法?
我在 Python 中使用鸭子打字。
不同对象作为 传入的地方object_to_flag
,都具有is_active
, is_spam
,is_offensive
属性。他们也碰巧有一个cleanup()
方法。
我传入的对象都具有相同的基类(它们是 Google App Engine 中的 db 对象):
我怎样才能使cleanup()
方法抽象,以便我可以为所有这些需要子提供实现的对象拥有相同的父类?
也许更重要的是,这是“pythonic”吗?我应该走这条路,还是应该只依靠鸭子打字?我的背景是 Java,我正在尝试学习 Python 的做事方式。
谢谢!
ruby - 一般来说,避免在 Ruby 中出现“nil:NilClass 的未定义方法‘some_method’”
Ruby 的鸭式打字很棒,但这是它咬我屁股的一种方式。我将运行一些长时间运行的文本处理脚本或运行某些东西,几个小时后,NoMethodError
由于变量变为nil
.
现在,一旦发生,通常很容易解决,但如果我能更好地预测这些错误,或者至少更优雅地处理这些类型的错误,那就更好了。抱歉这个问题含糊不清,但是这种类型的错误对我来说太频繁了,我想知道是否有避免它的好方法。
是否有一些与 Ruby 的这些“类型错误”相关的最佳实践?
ruby - Ruby 类类型和 case 语句
和有什么区别
和
出于某种原因,有时第一个有效而第二个无效,而其他时候,第二个有效而第一个无效。为什么?哪一种是“正确”的方法?
programming-languages - 什么是鸭子打字?
我在在线阅读软件上的随机主题时遇到了鸭子打字一词,并没有完全理解它。
什么是“鸭打字”?
python - 验证参数的 Pythonic 方法是序列而不是字符串
我有一个函数,它获取数据库表列表作为参数,并返回要在这些表上执行的命令字符串,例如:
应该返回类似:
这是使用tables_string='-t '+' -t '.join(tables)
.
当函数被调用时,乐趣就开始了:(tables=('stackoverflow')
字符串)而不是tables=('stackoverflow',)
(元组),这会产生:
因为字符串本身正在被迭代。
这个 SO question建议在类型上使用断言,但我不确定它是否足够 Pythonic,因为它打破了鸭子类型的约定。
有什么见解吗?
亚当
c# - 解决类型是否支持接口的最佳方法?(鸭子打字)
我在运行时使用Reflection.Emit
. 最终用户提供基本类型以及新类型应支持的接口。如果接口具有基类型不支持的成员,我创建一个存根方法,该方法调用存储在静态字段上的委托(我只支持具有 15 个或更少参数的非泛型方法,没有 ref 或 out 参数,因为这是我当前的要求。请不要提出此限制的问题。委托采用 baseType 的第一个参数),用户可以在尝试构造类型之前提供该参数。
但是,我想避免为类型可以满足的接口成员创建委托存根。例如
我希望如果您将这里发送Goose
给new[]{typeof(IDuck)}
我的构建器,我不会void Quack()
为 goose 满足接口创建存根。
接口映射不起作用,因为 Goose 没有实现 IDuck,并且我不能要求新构建的类型进行接口映射,因为TypeBuilder
它不支持需要构建的类型。
如何以远程有效的方式解决此问题?我只需要调查公开可见的成员,如果一个类型显式地实现了一个具有相同方法的接口,我可以假设它不应该用作目标。(例如,如果 Goose 已实现void IGoose.Quack()
,则不应将其视为 的目标void IDuck.Quack()
)。(无论如何, BindingFlags.Public | BindingFlags.Instance
应该足以过滤掉这些元素)。
java - 在 Java 中模拟鸭子类型
问题:我希望能够在 Java中通用地访问Java ojbect 上的任何属性/字段,类似于动态语言(想想 Groovy、JavaScript)。在编写此管道代码时,我不知道它是什么类型的对象或属性/字段名称是什么。但是当我去使用它时,我会知道属性/字段名称。
我当前的解决方案:到目前为止,我已经编写了一个简单的包装类,用于java.beans.Introspector
获取 Bean/POJO 的属性并将它们公开为Map<String, Object>
. 它很粗糙,但适用于简单的情况。
我的问题是除了反射/转换为地图之外,还有哪些其他方法可以解决这个问题?
在我在这条道路上走得更远之前,我想知道是否有人知道我如何从 Rhino 中蚕食一些东西,或者可能是javax.script.*
对这个概念进行了深思熟虑的实现。或者也许是我没有考虑过的完全不同的方法。
编辑:是的,我熟悉反射(我相信这是 Introspector 在幕后使用的)。我只是好奇是否还有其他经过深思熟虑的解决方案。
编辑2:似乎最流行的答案涉及1)直接或通过帮助类进行反射,和/或2)映射到实现所需类成员的接口。我对有关利用 Groovy 的评论很感兴趣。由于 Groovy 具有真正的鸭子类型并且它是一种 JVM 语言,有没有办法在 Groovy 中制作一个简单的助手并从 Java 中调用它?这真的很酷,可能更灵活,性能更好。
答:我将 Mike 的答案标记为最好的,因为它是一个最接近的完整概念。对于这种特殊情况,我可能不会走那条路,但这肯定是一种有用的方法。任何浏览此内容的人都应该确保阅读这里的对话,因为那里也有很多有用的信息。
谢谢!
reflection - 在 F# 中输入通用鸭子?
使用 let 内联和成员约束,我将能够为已知成员进行鸭式输入,但如果我想定义一个像这样的通用函数怎么办:
让鸭包装器<'a>鸭= ...
带有签名 'b -> 'a 并且返回的值将是一个实现 'a 的对象(这将是一个接口)并将调用转发给鸭子。
我已经在 C# 中使用 Reflection.Emit 完成了这项工作,但我想知道 F# 反射、引用或其他构造是否会使其更容易。
关于如何做到这一点的任何建议?
阅读蒂姆斯回答后编辑 我想我会提供更多细节
当我写关于使用引用来帮助时,我的想法是这样的:
!!是将引用转换为函数的运算符,%expr 是该方法的工作单元。我可以将表达式转换为函数(我猜)但不知道如何
当然,这也不能完全做到这一点,因为 IInterface 将是 'a,我希望 F# 反射可能有一些方便的功能,以便我可以基于类型对象和一些函数值构造一个类型
编辑 作为 Tomas Petricek 答案的更新,我将提供一些代码来解释我的需求
这是在 F#中移植“ DCI ”教科书示例的尝试。源和目标是 DCI 角色。这个想法是任何遵守特定合同的数据对象都可以播放这些。在这种情况下,合同很简单。source 需要一个名为 reduceBalance 的成员函数,destination 需要一个名为 increaseBalance 的成员函数。对于这种特定情况,我可以使用 let inline 和 member 约束来实现这一点。但是我想写一组给定接口和对象的函数。在这种情况下,它可能是源(作为对象)和
作为类型。结果将是一个 sourceContract 类型的对象,它将方法调用通过管道传递给源对象上具有相同名称的方法。
ruby - Ruby 是否支持包含多态性
Ruby 是否支持“包含多态性”?这和 Duck Typing 一样吗?
如果不是,那么 Ruby 中的多态性和鸭子类型有什么区别?
有人可以用我下面的例子来说明: