我正在尝试使用 Python 3 类型提示,以使我的代码更简洁。每当我尝试通过 mypy 传递我的代码时,都会出现一些重复的错误,提到有关 Optional 数据类型的内容,我不知道为什么。
这是一个示例函数。
def directory_to_dataframe(directory_name: str) -> pandas.DataFrame:
'''
Get the contents of a directory as a single dataframe.
:param directory_name: The directory to read
'''
# print(directory_name)
directory: str = os.path.join(CONTAINER_ROOT, directory_name)
def read_method(parquet: str) -> pandas.DataFrame:
return pandas.read_parquet(path=os.path.join(directory,
parquet))
if not os.path.isdir(s=directory):
return pandas.DataFrame()
files_to_read: Iterator[str] = filter(
lambda filename: filename.endswith('.parquet'),
os.listdir(path=directory))
try:
return pandas.concat(objs=map(read_method, files_to_read),
verify_integrity=True,
ignore_index=True).fillna(value=0) # Mypy raises error
except ValueError:
return pandas.DataFrame()
Mypy 抱怨 Incompatible return value type (got "Optional[DataFrame]", expected "DataFrame")
我认为 pandas.concat()
将始终返回一个数据帧,所以我不明白为什么返回类型必须是 Optional(这意味着 None
返回的可能性)。
这是另一个类似的案例。
daily_count: pandas.DataFrame = pandas.DataFrame(data=daily_ids['ID'].value_counts()).reset_index()
Mypy 抱怨 expression has type "Optional[DataFrame]", variable has type "DataFrame"
所以我缺少一些关于何时将 Optional
应用于变量或函数返回类型以使 mypy 满意的信息。此外,如果我确实应用了 Optional
,那么在涉及该变量的任何进一步操作中,MyPy 会抱怨该操作对 None
类型无效。