2013-08-26 22 views
1

我驚喜地發現使用PyDev的Eclipse能夠猜測大多數變量的類型並幫助顯示成員列表。我在學習Python,我認爲我應該忘記強類型語言的所有優點,但看起來我錯了。如何告訴Python IDE(和解釋器)變量的類型

我想知道IDE(甚至是Python解釋器)到底有多遠。我有一些模塊級別的變量在下面的代碼片段中定義,我希望IDE知道它們的類型。

關於IDE的問題1:是否可以聲明變量的類型,以便代碼完成知道其成員?

有關Python的問題2:是否可以聲明變量的類型,以便在執行過程中更改類型時發出警告?

例如,將光標放在以下代碼片段上的第一個c.後面並按ctrl+space,第一個建議是val。好極了!

Python的變量是動態的,它們的類型可以改變,因爲沒有辦法爲Eclipse知道,c在模塊級別定義,並在func2將被定義使用這一招並不第二c.工作在func1

c = None 

class MyClass: 
    val = 0 

def func1(): 
    c = MyClass() 
    print c. # Eclipse knows that val is a member of c 

def func2(): 
    print c. # Eclipse doesn't know that val is a member of c 
+1

截至目前,'c = None'行完全沒有。你在全局範圍內定義了''c',但你的代碼沒有在全局範圍內。 'func1'和'func2'中的'c'與你在那裏定義的'c'不同,並且彼此不同。也許你的IDE不認識'val'作爲'c'的成員,因爲'c'尚未在該範圍內定義,因此**具有**沒有成員,類或甚至值 – scohe001

+0

@Josh:我忘了兩個函數中的'global c',這本身就提高了猜測的質量。一個評論和兩個答案都非常有用,但'assert isinstance()'正是我所期待的。 – stenci

回答

4
def something(c): 
    #eclipse does not know what c is 
    assert isinstance(c,MyClass) 
    #now eclipse knows that c is an instance of MyClass 
    c. #autocomplete 
1

如果使用decorators您的IDE可能會意識到你在做什麼:

@accepts(MyClass) #Let python and the interpreter know 
def foo(bar):  #You're only accepting MyClass isntances 
    bar.   #Should autocomplete 
+1

請提供更多詳情。因爲你的例子導致語法錯誤(至少在python 2.6中) –

2

儘管斷言isinstance()不工作,2.8的PyDev添加補充說,信息的方式沒有斷言,只需通過正確記錄代碼(使用sphinx或epydoc docstrings)。

請參閱:http://pydev.org/manual_adv_type_hints.html以瞭解如何正確記錄代碼以接受類型聲明的詳細信息。

相關問題