2017-02-14 63 views
0

簡短版本:如果我定義一個裝飾器來在運行時導入一個模塊並在func_globals中聲明一個方法,我該如何告訴Pylint已經定義了結果變量?如何告訴pylint變量將在運行時定義?

龍版本:請看下面的例子:由於with_import裝飾爲create_array函數聲明numpy

from importlib import import_module 

def with_import(module): 
    modname = module.split('.')[-1] 
    def decorate(func): 
     def wrapper(*args, **kwargs): 
      func.func_globals[modname] = import_module(module) 
      return func(*args, **kwargs) 
     return wrapper 
    return decorate 

@with_import('numpy') 
def create_array(n): 
    return numpy.empty(n) 

print(create_array(5)) 

此代碼的工作就好了。但是,當我運行PyLint我看到

E: 16,11: Undefined variable 'numpy' (undefined-variable) 

有沒有辦法告訴Pylint這個變量實際上將在運行時定義?我真的不想爲整個模塊禁用unused-variable檢查,以防有人在以後實際聲明瞭一個未使用的常規變量。

+0

你能解釋一下你爲什麼要這樣做?這真的不是很好。 –

+0

'with_import'裝飾器在生產模塊中用於在運行時導入可選的依賴項,並引用調用函數的錯誤消息。我可以將它放入一個函數中,並在相關方法的第一行調用它,但裝飾器看起來更優雅(當時)。 –

回答

0

您可以禁用塊或線的基礎檢查,例如

def f(): 
    # pylint: disable=E0602 
    x[0] = 5 
    y[0] = 5 
# No errors 

def f(): 
    x[0] = 5 # pylint: disable=E0602 
    y[0] = 5 
# Only y will raise the undefined variable error 

隨着裝飾你有一個相當於第一個,我其實感到驚訝它的工作原理,並認爲這是相當難看,但:

@deco 
# pylint: disable=E0602 
def f(): 
    x[0] = 5 # No error here 
y[0] = 5 # Error here 

注意你必須在pylint的報告I: Locally disabling undefined-variable (E0602)

0

禁用它僅適用於它發生的確切行:

@with_import('numpy') 
def create_array(n): 
    return numpy.empty(n) # pylint: disable=undefined-variable 
0

如果您的裝飾器將參數等模塊提供給您的函數,該怎麼辦?

這裏有一個工作示例:

from importlib import import_module 

def with_import(module): 
    modname = module.split('.')[-1] 
    def decorate(func): 
     def wrapper(*args, **kwargs): 
      obj = import_module(module) 
      func.func_globals[modname] = obj 
      # merge modname=obj with kwargs 
      return func(*args, **dict({modname: obj}, **kwargs)) 
     return wrapper 
    return decorate 

@with_import('numpy') 
def create_array(n, numpy): 
    # module available here and nobody complains 
    return numpy.empty(n) 

print create_array(5) 
相關問題