导入还是不导入classmethod?

时间:2019-01-21 12:53:57

标签: python python-import class-method

我希望这不是一个愚蠢的问题,但是我在他们导入classmethod的地方找到了一些代码,而在没有导入的地方找到了一些代码,所以有区别吗?

我使用的是python 3.6,但我最初认为的代码适用于python 2.7(它使用from __builtin__ import

import unittest
from selenium import webdriver
from builtins import classmethod #original code was from __builtin__ import classmethod 


class HomePageTest(unittest.TestCase):
    @classmethod
    def setUp(cls):
        # create a new Firefox session
        cls.driver = webdriver.Firefox()
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()

        # navigate to the application home page
        cls.driver.get("http://demo-store.seleniumacademy.com/")

    def test_search_field(self):
        pass

    #My tests without @classmethod

    @classmethod
    def tearDown(cls):
        # close the browser window
        cls.driver.quit()

if __name__ == '__main__':
    unittest.main(verbosity=2)

2 个答案:

答案 0 :(得分:4)

通常,如果您的代码中还具有与内置名称相同的变量,并且也想访问内置名称,则仅导入builtins__builtin__。该模块的文档对此进行了很好的解释:

  

builtins — Built-in objects

     

此模块可直接访问Python的所有“内置”标识符;例如,builtins.open是内置函数open()的全名。有关文档,请参见Built-in FunctionsBuilt-in Constants

     

大多数应用程序通常不显式访问此模块,但是在提供与内置值同名的对象的模块中很有用,但其中也需要该名称的内置项。例如,在要实现包装内置open()的{​​{1}}函数的模块中,可以直接使用以下模块:

open()

但是,在您的情况下,文件中似乎没有import builtins def open(path): f = builtins.open(path, 'r') return UpperCaser(f) class UpperCaser: '''Wrapper around a file that converts output to upper-case.''' def __init__(self, f): self._f = f def read(self, count=-1): return self._f.read(count).upper() 定义,因此您实际上并不需要classmethod

答案 1 :(得分:-1)

在Python 3中,无需导入builtins模块或其内部的任何内容。如果在当前范围内查找名称失败,则会将builtins查找为后备。

如果需要维护代码完整性,请考虑在此之前显式检查Python版本。

import sys
if sys.version_info[0] == 2:
    from __builtin__ import classmethod