2

私が間違っていることを理解するのに少し助けが必要です。おそらくかなり基本的なことですが、私は脳を包み込んでいません。

私のコードはこれです:

class baseElement(object):
    def __init__(self):
        self.Portal = ''
        self.locator = ''

    def present(self):
        return self.Portal.PTF.Presence_of_Element(self.locator)    

    def visible(self):
        return self.Portal.PTF.Is_Element_Visible(self.locator)    

class baseActiveElement(baseElement):
    def hover(self):
        self.Portal.PTF.Mouse_over_element(self.locator)

    def click(self):
        self.Portal.PTF.Click_on_Element(self.locator)

    def get(self):
        return self.locator

これらのベースからオブジェクトをインスタンス化するときにポータルを定義します。ポータルには、指定されたアクションを実行するためのいくつかの関数が含まれています。これは機能します。そこに問題はありません。

しかし、ピリントはこうして不平を言います:

E1101:  8,15:baseElement.present: Instance of 'str' has no 'PTF' member
E1101: 11,15:baseElement.visible: Instance of 'str' has no 'PTF' member
E1101: 15,8:baseActiveElement.hover: Instance of 'str' has no 'PTF' member
E1101: 18,8:baseActiveElement.click: Instance of 'str' has no 'PTF' member

このエラーが発生しないようにするにはどうすればよいですか?

編集:initをこれに変更した場合:

class baseElement(object):
def __init__(self):
    self.Portal = object
    self.Portal.PTF = self.Portal.PTF
    self.locator = ''

pylintの反対意見はなくなり、ポータルをベースオブジェクトとして定義することの価値を理解できます。これは、最終的には実際のオブジェクトになるためですが、Portal.PTF自体を定義すること自体はナンセンスのように見えます。

4

1 に答える 1

4

推奨されるPythonの方法は、APIがこれらの属性の値をメソッドに提供するためにクライアントコードを必要としない場合に初期化して入力することですself.Portalself.locatorこの場合、クラスAPIにはこれら2つの属性の値を設定するメソッドがない可能性があります)。None__init____int__

Pylintは型推論を試みます。コードで確認できるself.Portalへの唯一の影響が文字列である場合、属性の型がstrであると推論し、これを使用してself.Portalで実行された呼び出しをチェックします。

あなたが書く場合:

class baseElement(object):
    def __init__(self, portal, locator):
        self.Portal = portal
        self.locator = locator

ポータルとロケーターのタイプについて何も知らないことを認識しようとします。

同じモジュールコードに次のようなものがある場合:

from somewhere import PortalClass, LocatorClass
# [...] 
element = SomeClassDerivingFromBaseElement(PortalClass(), LocatorClass()) 

次に、Pylintはこれを使用して、ポータルとロケーターの可能なタイプに関する知識を収集し、などの属性の定義を分析しPortalClassLocatorClassおそらくPTFのプロトタイプをチェックすることができますPresence_of_Element

補足:クラス、属性、メソッドの命名に一貫性を持たせることをお勧めします。Pylintが役立ち、使用する正規表現をカスタマイズして、使用する命名規則に一致させることができます。

于 2012-05-14T14:36:21.987 に答える