python动态修改另一个py文件里面变量的值--命名空间法

需求

封装了一个请求方法:
utils.py 部分代码

import requests

# 禁用安全请求警告
requests.packages.urllib3.disable_warnings()

port = 14591
headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53"
}


def get(route, **kwargs):
    return requests.get(f'https://127.0.0.1:{port}/{route}', headers=headers, **kwargs)

def post(route, **kwargs): ...

user.py调用get

from utils import *

querystring = {"name": "Sugar"}
get('api/v1/usr', params=querystring, verify=False)

这里面有一个问题,就是参数url是固定的,端口port不固定(我不想重新在调用这个函数的user.py文件里里面传入port这个参数,在调用该函数的文件最顶处声明就可以了),我想通过在user.py里面更改port的值,从而修改get方法里面传入的port值

开始我是在user.py里面定义了一个 port=14592,

# utils.py
def get(route, **kwargs):
    print('modify', port)

# user.py
port = 14591
print(port)
get('', )


# 运行 user.py 输出
"""
14591
modify 14592
"""

也就是说没有成功修改,访问的还是默认的端口,而不是修改后新的端口,
而且通过这两个port的id发现他们也是不一样的地址

解决

经过尝试,想到了类可以作为python动态语言里面的关键词 类 class (理解为) 命名空间来实现所谓的静态变量 static 这里操作符由于python没有花括号{}, 只能冒号:
感觉有点类似于C/C++里面的 extern int x;
用之前先声明一下,至于什么时候用,在哪里用,什么时候再用, 再考虑给他赋值,
并且给个报错即可

# utils.py 定义 get 方法
class params: pass
params.port = 14592
def get(route, **kwargs):
    print('modify', params.port)
# 
# user.py调用
from utils import *

params.port = 14591
print(params.port)
get('')

打印结果

14591
modify 14591

即使utils.py里面不定义 params.port = 14592 也是可以用的

# utils.py 定义 get 方法
class params: pass # 定义一个命名空间(作用域),里面什么也没有 ... or pass
# params.port = 14592 # 定义并赋值
# params.port = ...  # 定义不给值, python定义变量不能只有个变量,所以等号右边(右值)必须要有东西
# 不定义,一样是可以用的,目的就是要被其他py文件调用的,如果怕IDE提示未定义属性问题,加上也可以
def get(route, **kwargs):
    print('modify', params.port)
# 
class params: ...

params.port = ...

def get(route, **kwargs):
    params.port = 145913214
    print('modify', params.port)

print(params.port)

params.port = 14591
print(params.port)

get('')
print(params.port)

打印结果:

Ellipsis
14591
modify 145913214
145913214

个人感觉比global好用,项目里面全局变量多的情况下,名字也不好起
如果有修改需求的话,对比 yaml?
衍生出:

class params:
    class web:
        class database: ...

    class client:
        ui: ...

    class embedded: ...

版权声明:本文为qq_34580627原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。