Pythonの:Execで関数を作成するには、forループ、クラス内の、関数内で実行しています

ロブKwasowski:

私はそれが複雑に聞こえる知っていて、それが可能ではないかもしれないが、私はとにかく試してみようと思いました。

私はセレンでこするいくつかのウェブ、と私はページ上のいくつかのjQueryを実行することを任意の時間をやって、代わりに抱えているので、

driver.execute_script("$('button').parent().click()")

私は私のコードを整理したいとちょうど持っています

j('button').parent().click()

私は、クラスを持っていることによって、これを達成しようとしてるjようにあなたが機能を持っているときにとparent、それだけでそのクラスの別のインスタンスを返します。

これらの例では、私はちょうどそれがより簡単にテストできるように実行されます文字列を印刷しています。そして、私はそれを持っている方法は、クラスは、関数内に存在します。

すべてのクラスの機能が正常に定義されている場合したがって、この例ではすべてが正常に動作しますが、あなたがコメントを外した場合にforループ部をと定義.parent()して機能をexec、あなたがエラーを取得しますNameError: name 'j' is not defined

def browser():

    class j:

        def __init__(self, str):
            if str[0] == '$':
                self.jq = str
            else:
                self.jq = f"$('{str}')"

        def click(self):
            output = f"{self.jq}.click()"
            print(output)
            return j(output)

        def parent(self):
            return j(f'{self.jq}.parent()')

        # functions = 'parent, next, prev'
        # for fn in functions.split(', '):
        #     exec(
        #         f"def {fn} (self):\n" +
        #         f"    return j(f'{{self.jq}}.{fn}()')"
        #     )

    j('button').parent().click()

browser()

しかし、あなたはのすべての外に移動した場合browserの機能を実行し、すべてが、その後エラーは道もあることもありませんし、あなたが機能のいずれかの方法を定義した場合、それはです。

私もやってみましたexec(code, globals())が、それはちょうど私に別のエラーメッセージが代わりに与えました:AttributeError: 'j' object has no attribute 'parent'

で関数を定義するためにいくつかの方法がありexec、このようにして、私がやろうよ何をしますか?

編集:これは、全体のエラーメッセージは次のとおりです。

Traceback (most recent call last):
  File "C:\Users\Rob\Desktop\site\mysite\py\z.py", line 30, in <module>
    browser()
  File "C:\Users\Rob\Desktop\site\mysite\py\z.py", line 28, in browser
    j('button').parent().click()
  File "<string>", line 2, in parent
NameError: name 'j' is not defined
ロブKwasowski:

彼はupvotesに値するようFurasの第二の答えは、ほとんどの方法のそこに私を得ました。しかし、私はそれを改善し、それは私が探していたすべてを行うために得ることができました。

だからここに引数をチェックタイプと文字列の周りのプットの引用符ではなく、数字を取ることができ、私のバージョンがあります。

def browser():

    class j:

        def __init__(self, str):
            self.jq = f"$('{str}')"

        def click(self):
            self.jq += ".click()"
            print(self.jq)
            return self

        @classmethod
        def quotes(cls, arg):
            q = "'" * (type(arg) == str and len(arg) > 0)
            output = f'{q}{arg}{q}'
            return output

        @classmethod
        def add_function(cls, name):
            def func(cls, arg=''):
                cls.jq += f'.{name}({j.quotes(arg)})'
                return cls
            func.__name__ = name
            setattr(j, name, func)

    j_functions = 'closest, eq, find, next, parent, parents, prev'
    for fn in j_functions.split(', '):
        j.add_function(fn)

    j('button').eq(0).next('br').prev().click()

browser()


>> $('button').eq(0).next('br').prev().click()

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=4541&siteId=1