从另一个文件的不同函数访问变量

Access variable from a different function from another file

我在目录 mypythonlib

中有一个文件 myfunctions.py
from requests_html import HTMLSession
import requests

def champs_info(champname:str, tier_str:int):  
    url = f"https://auntm.ai/champions/{champname}/tier/{tier_str}"
    session = HTMLSession()
    r = session.get(url)
    r.html.render(sleep=1, keep_page=True, scrolldown=1)

    information = r.html.find("div.sc-hiSbYr.XqbgT")
    sig = r.html.find('div.sc-fbNXWD.iFMyOV')
    tier_access = information[0]
    tier = tier_access.text

我想通过另一个文件访问变量 tier - test_myfunctions.py 但问题是我还必须为函数 champs_info 提供参数,以便它可以相应地访问 url。

from mypythonlib import myfunctions
def test_champs_info():
    return myfunctions.champs_info("abomination",6).tier

但是在 运行 这段代码中,我得到了错误-

./tests/test_myfunctions.py::test_champs_info Failed: [undefined]AttributeError: 'NoneType' object has no attribute 'tier'
def test_champs_info():
>       return myfunctions.champs_info("abomination",6).tier
E       AttributeError: 'NoneType' object has no attribute 'tier'

tests/test_myfunctions.py:3: AttributeError

对此有任何解决方案吗?为什么此代码无法访问变量? 我写 myfunctions.champs_info("abomination",6).tier 希望它能从 champs_info 函数中获取 tier 变量,同时从 myfunctions 文件中为它提供所需的所有参数:(

在 myfunctions.champs_info() 中添加 return 层

并在脚本 test_myfunctions.py 中删除 .tier

您可以通过以下方式访问函数中变量的值:1) return函数中的值,2) 在模块中使用全局变量,或 3) 定义一个 class.

如果只想访问一个函数的局部变量,那么函数应该 return 该值。 class 定义的一个好处是您可以根据需要访问定义任意数量的变量。

1. Return价值

def champs_info(champname:str, tier_str:int):  
    ...
    tier = tier_access.text
    return tier

2。全球

tier = None
def champs_info(champname:str, tier_str:int):
    global tier
    ...
    tier = tier_access.text

已访问全局层变量。

from mypythonlib import myfunctions

def test_champs_info():
    myfunctions.champs_info("abomination", 6)
    return myfunctions.tier

print(test_champs_info())

3。 class定义:

class Champ:
    def __init__(self):
        self.tier = None
    def champs_info(self, champname:str, tier_str:int):  
        ...
        self.tier = tier_access.text

test_functions.py 可以用这种方式调用 champs_info()。

from mypythonlib import myfunctions

def test_champs_info():
    info = myfunctions.Champ()
    info.champs_info("abomination", 6)
    return info.tier
    
print(test_champs_info())

您只需 return 从 champs_info() 函数

分层

就像这样:

myfunctions.py

from requests_html import HTMLSession
import requests

def champs_info(champname:str, tier_str:int):  
    url = f"https://auntm.ai/champions/{champname}/tier/{tier_str}"
    session = HTMLSession()
    r = session.get(url)
    r.html.render(sleep=1, keep_page=True, scrolldown=1)

    information = r.html.find("div.sc-hiSbYr.XqbgT")
    sig = r.html.find('div.sc-fbNXWD.iFMyOV')
    tier_access = information[0]
    tier = tier_access.text
    return tier               # <---- Focus Here

test_myfunctions.py

import myfunctions

print(temp.champs_info("americachavez", 6))

就是这样。大功告成。