我刚刚切换到PyCharm,我很高兴它为我提供的所有警告和提示来改进我的代码。除了这个我不明白

此检查检测在外部作用域中定义的阴影名称。

我知道从外部范围访问变量是不好的做法,但阴影外部范围的问题是什么?

下面是一个例子,PyCharm给了我警告信息:

data = [4, 5, 6]

def print_data(data): # <-- Warning: "Shadows 'data' from outer scope
    print data

print_data(data)

当前回答

要忽略这个警告,就像克里斯托弗在评论中说的,你可以在上面评论

# noinspection PyShadowingNames

其他回答

我喜欢在PyCharm的右上角看到一个绿色的勾。我在变量名后面加上下划线,只是为了清除这个警告,这样我就可以专注于重要的警告。

data = [4, 5, 6]

def print_data(data_):
    print(data_)

print_data(data)
data = [4, 5, 6] # Your global variable

def print_data(data): # <-- Pass in a parameter called "data"
    print data  # <-- Note: You can access global variable inside your function, BUT for now, which is which? the parameter or the global variable? Confused, huh?

print_data(data)

这取决于函数的长度。函数越长,将来修改它的人写数据时认为它意味着全局的可能性就越大。实际上,它指的是局部函数,但由于函数太长,它们并不清楚是否存在具有该名称的局部函数。

对于你的例子函数,我认为遮蔽全局一点都不坏。

这样做:

data = [4, 5, 6]

def print_data():
    global data
    print(data)

print_data()

它看起来像是100%的pytest代码模式。

See:

Pytest fixture:显式的、模块化的、可伸缩的

我也有同样的问题,这就是为什么我找到了这篇文章;)

# ./tests/test_twitter1.py
import os
import pytest

from mylib import db
# ...

@pytest.fixture
def twitter():
    twitter_ = db.Twitter()
    twitter_._debug = True
    return twitter_

@pytest.mark.parametrize("query,expected", [
    ("BANCO PROVINCIAL", 8),
    ("name", 6),
    ("castlabs", 42),
])
def test_search(twitter: db.Twitter, query: str, expected: int):

    for query in queries:
        res = twitter.search(query)
        print(res)
        assert res

并且它将警告“此检查检测在外部作用域中定义的阴影名称”。

要解决这个问题,只需将twitter fixture移动到。/tests/conftest.py

# ./tests/conftest.py
import pytest

from syntropy import db


@pytest.fixture
def twitter():
    twitter_ = db.Twitter()
    twitter_._debug = True
    return twitter_

并删除twitter fixture,如./tests/test_twitter2.py:

# ./tests/test_twitter2.py
import os
import pytest

from mylib import db
# ...

@pytest.mark.parametrize("query,expected", [
    ("BANCO PROVINCIAL", 8),
    ("name", 6),
    ("castlabs", 42),
])
def test_search(twitter: db.Twitter, query: str, expected: int):

    for query in queries:
        res = twitter.search(query)
        print(res)
        assert res

这将使QA, PyCharm和每个人都感到高兴。