从函数访问模块变量是否被认为是不好的做法?

Dan*_*aga 8 python variables module function global-variables

在 Python 中,函数可以按如下方式访问模块变量:

def pow(a):
    return a**b

a = 3
b = 2
print(pow(a))
Run Code Online (Sandbox Code Playgroud)

这被认为是不好的做法吗?

明显的替代方案是将所有参数显式传递给函数:

def pow(a, b):
    return a**b

a = 3
b = 2
print(pow(a, b))
Run Code Online (Sandbox Code Playgroud)

我使用第一种形式来限制传递给函数的参数数量,我想知道这是否被认为是不好的做法。

Zac*_*tes 5

有可能的; 但如果这样做,请使用globalor关键字。nonlocal

LOGGER = logging.getLogger('FooLogger')
LOGGER.setLevel(logging.INFO)

def log_this(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        global LOGGER # this is in the global namespace
        nonlocal func # this is from the parent function
        retval = func(*args, **kwargs)
        LOGGER.info('%s(*%s, **%s)=%s', func.__name__, args, kwargs, retval)
        return retval
    return wrapper

@log_this
def cube(base, *, mod=None):
    return pow(base, 3)

>>> cube(4)
INFO:FooLogger:cube(*(4,), **{})=64
64
>>> cube(4, mod=7)
INFO:FooLogger:cube(*(4,), **{'mod': 7})=1
1
Run Code Online (Sandbox Code Playgroud)

但通常最好将变量显式传递给函数。这增强了可读性,并减少了函数用途的模糊性。考虑以下:

MIN_SIZE = 5

def check_size(collection):
    global MIN_SIZE
    return len(collection) > MIN_SIZE

>>> check_size([1, 2, 3])
False
Run Code Online (Sandbox Code Playgroud)

乍一看,我看到它check_size被称为,但它检查的尺寸是多少?如果我不知道,我就得去寻找。这是一个可读性问题,随着程序的增长,只会造成更多的混乱。

MIN_SIZE = 5

def check_size(collection, size):
    return len(v) > n

>>> check_size(range(10), MIN_SIZE)
True
Run Code Online (Sandbox Code Playgroud)