从静态lang(java/c#)移动到像python这样的动态语言的人最常见的问题

对于从静态语言(java / c#)移动到动态语言(如python)的人来说,最重要的是什么?

如何完成任务似乎很酷,但重命名方法,或添加/删除参数似乎有风险!

是为每种方法编写测试的唯一解决方案吗?

最佳答案
我想说,第一个问题是尝试用动态语言编写静态类型代码.

不要犹豫,使用标识符指向字符串,然后使用自包含代码段中的列表

keys = 'foo bar foobar' # Imagine this coming in as an argument
keys = keys.split() # Now the semantically chose name for the argument can be 
                    # reused As the semantically chosen name for a local variable

不要犹豫,像常规值一样对待函数:它们是.采取以下解析器.假设我们想要处理所有标头标签和ul标签,如ol标签.

class Parser(HTMLParser):
    def __init__(self, html):
        self.feed(html)

    def handle_starttag(self, tag, attrs):
        parse_method = 'parse_' + tag    
        if hasattr(self, parse_method):  
            getattr(self, parse_method)(attrs)


    def parse_list(self, attrs):
        # generic code

    def parse_header(self, attrs):
       # more generic code

    parse_h1 = parse_h2 = parse_h3 = parse_h4 = parse_h5 = parse_h6 = parse_header
    parse_ol = parse_ul = parse_list

这可以通过在java这样的语言中使用handle_starttag方法中的通用代码来完成,方法是跟踪哪些标记映射到同一个方法但是如果您决定要处理div标记,则必须将其添加到调度中逻辑.在这里你只需添加方法parse_div就可以了.

不要打架!鸭式!

def funtion(arg):
    if hasattr(arg, 'attr1') and hasattr(arg, 'attr2'):
         foo(arg):
    else:
         raise TypeError("arg must have 'attr1' and 'attr2'")

而不是isinstance(arg,Foo).这允许您使用attr1和attr2传入任何对象.这允许您例如传入包裹在对象周围的跟踪类以进行调试.您必须修改类才能在Java AFAIK中执行此操作.

正如THC4k所指出的,另一种(更加pythonic)方式是EAPF成语.
我不喜欢这个,因为我喜欢尽早发现错误.如果您希望代码很少失败,那么效率会更高.不要告诉任何人我不喜欢它虽然我们他们会停止认为我知道如何编写python.这是THC4k的一个例子.

try: 
    foo(arg): 
except (AttributeError, TypeError): 
    raise InvalidArgumentError(foo, arg)

关于我们是否应该捕获AttributeError和TypeError或者只是让它们传播到知道如何处理它们的地方,这是一个折腾,但这只是一个例子,所以我们会让它飞起来.

转载注明原文:从静态lang(java/c#)移动到像python这样的动态语言的人最常见的问题 - 代码日志