【问题标题】:Is it safe to use the python word "type" in my code?在我的代码中使用 python 单词“type”是否安全?
【发布时间】:2012-05-21 00:54:12
【问题描述】:

我可以在自己的代码中使用单词type 还是保留它?我的函数头:

def get(
    self,
    region='Delhi',
    city='Delhi',
    category='Apartments',
    type='For sale',
    limit=60,
    PAGESIZE=5,
    year=2012,
    month=1,
    day=1,
    next_page=None,
    threetapspage=0,
):

【问题讨论】:

    标签: python python-2.7 reserved-words


    【解决方案1】:

    使用type 作为函数的关键字参数将屏蔽函数范围内的built-in function "type"。因此,虽然这样做不会引发SyntaxError,但这不是一种好的做法,我会避免这样做。

    【讨论】:

    • 但是,在函数范围内,我看不出有什么大问题。 id 也一样,这更常见。
    • 出于这个原因,我避免使用命名变量id。这不是一个坏主意,因为其他开发人员可能会尝试使用内置函数并遇到奇怪的行为?如果您可以提供指向执行此操作的框架/库的链接,我愿意重新考虑。
    • 恕我直言,这真的取决于上下文和功能。
    • 我只是在接收一些将list 定义为变量的代码。这是一个有点庞大的函数,所以当我尝试使用它时,list() 内置函数被屏蔽并不是很明显。
    【解决方案2】:

    两者都没有。它不是保留字(可以在 http://docs.python.org/reference/lexical_analysis.html#keywords 找到它的列表),但隐藏任何内置命令通常是个坏主意。

    【讨论】:

    • 顺便说一句,import keyword; print keyword.kwlist 会完成同样的事情。
    【解决方案3】:

    虽然其他人指出阴影 python 内置函数是不好的形式,但只有将函数或函数参数命名为 type 时才会出现这种情况 -

    需要注意的是,如果您将类属性命名为type,python 内置的type 不会以任何方式隐藏。

    即使在引用您的类属性时,它也总是以类实例self 或自定义实例变量为前缀——并且python 内置不会受到阻碍。

    例如:

    好的:

    >>> class SomeClass():
    ...     type = 'foobar'
    ...
    ...     def someFunction(self):
    ...         return self.type
    

    不好:

    >>> def type(): # Overrides python built-in in global scope
    ...     pass
    ...
    >>> def foobar(type):
    ...     return type # Overrides python built-in within func
    

    【讨论】:

    • 如果你使用打字提示,第一个是不行的。考虑一下:class SomeClass: type: type |无 = 无
    【解决方案4】:

    这是十多年前的问题,为了安全起见,我建议使用 kind 而不是 type 作为参数。

    很长一段时间我都在考虑为所有保留或内置的重命名建议,但看到你的问题让我终于做到了。

    请查看python-keyword-aliases.md 并随时向该列表提出新条目。

    【讨论】:

      【解决方案5】:

      type 绝对应该被视为保留字。虽然将这个词用于数据库字段可能很诱人,但请考虑type() 是最重要的调试/测试功能之一这一事实,因为它告诉您对象的class

      $ python
      
      >>> x = 5
      >>> s = "rockets"
      >>> y = [1,2,3] 
      
      >>> print(type(x)) 
      class 'int'
      
      >>> print(type(s))
      class 'str'
      
      >>> print(type(y)) 
      class 'list'
      

      地图集将被归类为一类书籍,但请考虑改用“类别”一词。

      【讨论】:

      • 尽管我们确实有built-in function,但我在here 的保留字中找不到type。我错过了什么吗?无论如何,我会听从你的建议并使用另一个词。
      【解决方案6】:

      一个带有阴影的内置变量,如 typeid:如果你碰巧复制/粘贴了覆盖 id 的代码,然后你用其他东西替换了变量的所有实例,但是忘记重命名一个实例所以你仍然使用悬空id,代码在语法上仍然是有效的,linter 很可能甚至找不到错误,但你会得到非常奇怪的结果当您运行代码时,因为 id 不会像您预期的那样是字符串或数字。它将是内置函数id

      这让我大跌眼镜。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 2013-01-25
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2015-05-04
        相关资源
        最近更新 更多