Questions tagged «duck-typing»

4
Python宽恕与权限和鸭子输入
在Python中,我经常听到“乞求宽恕”(捕获异常)比“询问许可”(类型/条件检查)更好。关于在Python中强制鸭子输入,这是 try: x = foo.bar except AttributeError: pass else: do(x) 胜过或坏于 if hasattr(foo, "bar"): do(foo.bar) else: pass 在性能,可读性,“ pythonic”或其他重要因素方面?


4
为什么许多鸭子式动态编程语言会使用基于类的方法而不是基于原型的OOP?
由于许多动态编程语言都具有鸭类输入法的功能,并且它们还可以随时打开和修改类或实例方法(例如Ruby和Python),因此…… 问题1)动态语言课程的需求是什么?为什么要用这种方式设计语言,以将类用作某种“模板”,而不是以原型方式使用而只是使用对象? 另外的JavaScript是原型为基础,但CoffeeScript的(JavaScript的加强版),选择基于类的方式。它也适用于相同的Lua(原型为基础)和MoonScript(类为主)。此外,ES 6中还有一门课。所以…… 问题2)是否暗示着,如果您尝试改进基于原型的语言,则应将其更改为基于类的语言?如果没有,为什么要这样设计?

6
鸭子是否正在输入多态性的子集
从WIkipedia上的多态 在计算机科学中,多态是一种编程语言功能,它允许使用统一的界面来处理不同数据类型的值。 从维基百科上的鸭子打字 在使用面向对象的编程语言进行的计算机编程中,鸭子类型是一种动态类型的类型,其中对象的当前方法和属性集确定有效的语义,而不是其从特定类或特定接口的实现继承。 我的解释是,基于鸭子的类型,对象的方法/属性确定了有效的语义。这意味着对象的当前形状决定了它所坚持的界面。 从多态性可以说,如果一个函数接受多种不同的数据类型,只要它们支持一个接口,则该函数就是多态的。 因此,如果一个函数可以忽略类型,则它可以接受多种不同的数据类型并对其进行操作,只要这些数据类型具有正确的方法/属性并因此维护接口即可。 (术语“接口”的使用不是作为代码结构,而是作为描述性的文档结构)。 鸭型与多态性的正确关系是什么? 如果一种语言可以鸭式输入,是否意味着它可以做到多态?

3
在不总是检查属性和方法的情况下,如何在JavaScript中使用鸭子输入?
我知道javascript使用鸭子类型,而且起初我认为与强类型语言(如C#)相比,这会使多态性变得容易。但是现在,我带有参数的函数充满了诸如此类的东西: if(myObj.hasSomeProperty()) 要么 if(myObj.hasSomeMethod()) 要么 if(isNumber(myParam)) 等等 这对我来说真的很丑。我来自C#背景,发现定义的接口要好得多。 我想知道我是否错误地尝试应用在静态类型的语言中有效的策略,并且在javascript中有更好的方法呢? 我知道我无法检查,但是跟踪javascript运行时错误可能是一场噩梦,因为它们并非总是在代码中实际发生错误的地方发生。

1
使用Python进行鸭子输入,数据验证和断言编程
关于鸭子打字: 通过惯用性地不测试方法和函数体中的自变量类型,依靠文档,清晰的代码和测试来确保正确使用,可以帮助进行鸭子键入。 关于论证验证(EAFP:比宽恕更容易获得宽恕)。来自这里的改编示例: ...被认为是更pythonic的: def my_method(self, key): try: value = self.a_dict[member] except TypeError: # do something else 这意味着使用您的代码的其他任何人都不必使用真正的字典或子类-他们可以使用实现映射接口的任何对象。 不幸的是,实际上并不是那么简单。如果上述示例中的member可能是整数怎么办?整数是不可变的-因此将它们用作字典键是完全合理的。但是,它们也用于索引序列类型对象。如果member恰好是整数,则示例二可以让列表,字符串以及字典通过。 关于断言编程: 断言是检查程序内部状态是否符合程序员期望的一种系统方法,目的是捕获错误。特别是,它们非常适合捕获编写代码时做出的错误假设,或捕获其他程序员滥用接口的情况。此外,通过使程序员的假设显而易见,它们可以在一定程度上充当内联文档。(“显式优于隐式。”) 提到的概念有时会发生冲突,因此在选择是否完全不进行任何数据验证,进行强力验证或使用断言时,我会依靠以下因素: 强力验证。通过强力验证,我的意思是引发自定义Exception(ApiError例如)。如果我的函数/方法是公共API的一部分,则最好验证参数以显示有关意外类型的良好错误消息。通过检查类型,我并不是指仅使用isinstance,而是通过的对象是否支持所需的接口(鸭子输入)。当我记录API并指定期望的类型并且用户可能想以意外方式使用我的函数时,在检查这些假设时,我会感到更加安全。我通常使用isinstance,如果以后要支持其他类型或鸭子,则可以更改验证逻辑。 断言编程。如果我的代码是新的,我会使用很多断言。您对此有何建议?以后是否从代码中删除断言? 如果我的函数/方法不是API的一部分,而是将其某些参数传递给我未编写,研究或测试的其他代码,则我会根据被调用的接口执行很多断言。我的逻辑背后-最好在我的代码中失败,然后在堆栈跟踪中加深10个级别,出现难以理解的错误,这迫使进行大量调试,然后无论如何都将断言添加到我的代码中。 断言,关于何时使用或不使用类型/值验证的评论和建议?很抱歉,问题不是最好的表述。 例如,考虑以下函数,其中Customer是SQLAlchemy声明性模型: def add_customer(self, customer): """Save new customer into the database. @param customer: Customer instance, whose id is None @return: merged into global session customer …

1
隐式与显式接口
我想我了解编译时多态和运行时多态的实际限制。但是显式接口(运行时多态,即虚拟函数和指针/引用)与隐式接口(编译时多态,即模板)之间在概念上有什么区别。 我的想法是,提供相同显式接口的两个对象必须是相同类型的对象(或具有共同的祖先),而提供相同隐式接口的两个对象不必是相同类型的对象,并且不包括隐式对象他们俩都提供的接口可以具有完全不同的功能。 有什么想法吗? 并且,如果两个对象提供相同的隐式接口,那么还有什么原因(除了不需要动态分配带有虚拟函数查找表的技术好处等)之外,还有其他原因导致这些对象不能从声明该接口的基础对象继承而来。使它成为显式接口?换一种说法:您能给我一个例子吗,两个提供相同隐式接口的对象(因此可以用作示例模板类的类型)不应从使该接口显式的基类继承? 一些相关的帖子: https://stackoverflow.com/a/7264550/635125 https://stackoverflow.com/a/7264689/635125 https://stackoverflow.com/a/8009872/635125 这是使这个问题更具体的示例: 隐式接口: class Class1 { public: void interfaceFunc(); void otherFunc1(); }; class Class2 { public: void interfaceFunc(); void otherFunc2(); }; template <typename T> class UseClass { public: void run(T & obj) { obj.interfaceFunc(); } }; 显式接口: class InterfaceClass { public: virtual void …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.