2016-11-24 80 views
7

linter: AncakPython typehints ve böyle örneğin, bizim piton projeye statik typechecking ekleyerek oldum

from typing import List 
from something import MyOtherClass 

class MyClass: 
    def __init__(self) -> None: 
     self.some_var = None # type: List[MyOtherClass] 

, biz (flake8 ve PyLint) örneği List olarak kullanılmayan değişkenler için raporu kullanma şimdi linter Çünkü gerçek kodda kullanılmazlar. (Bu arada pep8 iyi işliyor).

Bu yüzden bu kod değiştirerek sona:

from typing import List # noqa # pylint: disable=unused-import 
from something import MyOtherClass # noqa # pylint: disable=unused-import 

class MyClass: 
    def __init__(self) -> None: 
     self.some_var = None # type: List[MyOtherClass] 

bu çözmek için daha iyi bir çözüm var mı? Kullanılmayan tüm içe aktarma uyarılarını devre dışı bırakmak istemiyoruz.

cevap

3

Python 3.6, PEP 526: Syntax for Variable Annotations uygular, adından da anlaşılacağı gibi, değişken açıklamaları için yeni sözdizimi ortaya koyar ve yazım türlerine olan ihtiyacı ortadan kaldırır. Şimdi doğrusu kodda gerçek jeton olarak görünür

from typing import List, Optional 
from something import MyOtherClass 

class MyClass: 

    some_var: Optional[List[MyOtherClass]] 

    def __init__(self) -> None: 
     self.some_var = None 

List yana ve MyOtherClass:

from typing import List, Optional 
from something import MyOtherClass 

class MyClass: 

    def __init__(self) -> None: 
     self.some_var: Optional[List[MyOtherClass]] = None 

... ya da alternatif: Yeni sözdiziminde

, kodunuz olarak yeniden olurdu yorumlardan daha fazla, linterlerin gerçekten kullanılmakta olduklarını kabul etmekte zorluk çekmemeleri gerekir.

+0

ben tip kontrolü için yeni Bu çok aptalca bir soru ise özür dilerim, ama gerçekten '__init __() '(yapıcı)' Yok'unu döndürdüğünü tanımlamak gerekli midir? – Guillaume

+2

@Guillaume, [PEP 484] 'e göre (https://www.python.org/dev/peps/pep-0484/#the-meaning-of-annotations), * "__init__'nin dönüş türü olmalıdır. '-> Hiçbiri' ile açıklanamaz. Bunun nedeni süptildir. '__init__', '-> None' ifadesinin bir geri sayımını kabul ettiyse, bu, argümansız, açıklanmamış '__init__' yönteminin hala türünde olması gerektiği anlamına gelir Bu muğlaklıktan vazgeçmek ya da istisnaya bir istisna getirmekten ziyade, '__init__' için bir dönüş açıklaması olması gerektiğini' söylüyoruz. * –

+0

Ah, 3.6 sürümünüzü bekliyor! – tobspr

3

@Zero Piraeus answer bu konudaki en yeni çözümü sunar (örn. Değişken ek açıklamaları kullanın, ayrıca bkz: What are variable annotations in Python 3.6?). Eğer # type: yorumlarınızı kullanırken

Bunun dışında size List ithal etmek gerek bile yok. mypy, bunların içe aktarılmalarını ve bildiğim kadarıyla pyflakes veya pylint gerektirmemelerini gerektirmez.

Python aslında bir isim bakmak-up gerçekleştiren bir yerde kendi adını kullanmayı gerektirir sürece typing isimleri almak için gerek yok (ve yorumlarda, bu gerekli değildir.)

+0

Sadece denedim ve mypy yazım modülü üyeleri için ithalat gerektirmiyor, ancak yazım modülü – tobspr

+0

@tobspr yapmıyorsa diğer sınıfların/türlerin içe aktarılmasını gerektiriyor. Eğer sadece '' yazısını kullanırsanız: 'yorumlar yazarak' 'yazarak' şeyler almanıza gerek yoktur. Her şey elbette bir ithalat olarak gereklidir. Bir listeyi 'def foo (a: List [int]) olarak alan bir işlev tanımlarsanız, ismin çözümlenebilmesi için' yazarak '' '' '' 'yazarak '' '' '' '' '' '' '' '' '' '' '' i içe aktarmanız gerekir. –