cqwcns 发表于 2021-1-18 08:26

python,我去,PyCharm老是有不知道原因的警告,求解决方法

我去,PyCharm老是有不知道原因的警告,求解决方法(是符合pep8的规范写法,不是屏蔽警告)。

告警内容:
应为类型 'function',但得到的是 '(x: Any) -> Any'
应为类型 'function',但得到的是 '(x: Any) -> str'
应为类型 'function',但得到的是 '(x: Any) -> Union'
应为类型 'function',但得到的是 '(x: Any) -> Union'


完整代码:
import os
# import re
# import datetime
# import numpy as np
# import jinja2
from collections import Counter
import pandas as pd
# from openpyxl import Workbook
from openpyxl import load_workbook
import warnings

# 忽略告警
warnings.filterwarnings("ignore")

# ######基础变量######
# 声明源数据路径
str_path_source_data = 'D:\\python\\playSignIn'

# 区域网格字典
dict_regions_grids = {'茂南': ['开发区', '茂北', '西城', '油城北', '油城东', '油城南'],
                      '电白': ['滨海', '林头', '麻岗', '南海', '沙琅', '水东'],
                      '高州': ['大井', '高城北', '高城南', '根子', '石鼓', '长坡'],
                      '化州': ['合江', '河东', '化北', '化河西', '同庆', '杨梅'],
                      '信宜': ['北界', '城北', '城南', '合水', '钱排', '朱砂']}


# ######函数######

# 获得人员分类
def func_get_class(x):
    if '质控' in x:
      return '质控人员'
    elif '线路班' in x:
      return '机动队人员'
    else:
      return '装维人员'


# 获得人员部门
def func_get_department(x):
    if x['分类'] == '质控人员':
      return '质控组'
    elif '自建自维' in x['所属组织']:
      return '自建自维'
    else:
      for str_region in dict_regions_grids:
            if str_region in str(x):
                return str_region
      return '未知'


# 获得人员班组
def func_get_group(x):
    if x['分类'] == '质控人员':
      if x['姓名'] in dict_qc_personnel:
            return dict_qc_personnel]
      else:
            return '未知'
    elif x['分类'] == '机动队人员':
      return '机动队'
    elif x['部门'] == '自建自维':
      return '自建自维组'
    else:
      for str_region in dict_regions_grids:
            if str_region == str(x['部门']):
                for str_grid in dict_regions_grids:
                  if str_grid in str(x['所属组织']):
                        return str_grid


# 获得签到天数
def func_sign_in_Days(x):
    if x['姓名'] in dict_sign_in_days:
      return dict_sign_in_days]
    else:
      return 0


# ######输入源数据######
# 获得源数据文件夹的全部文件名称
list_dir = os.listdir(str_path_source_data)

str_personnel = 0
str_sign_in = 0
str_qc_personnel = 0

# 循环文件
for str_file in list_dir:
    if os.path.isfile(str_path_source_data + '\\' + str_file):
      if '系统人员' in str_file:
            str_personnel = str_file
      elif '签到' in str_file:
            str_sign_in = str_file
      elif '质控人员' in str_file:
            str_qc_personnel = str_file

# 判断文件是否存在,如果不存在,则提示错误并退出
if 'str_personnel' not in locals().keys():
    print('[错误] 未找到文件名包含“系统人员”关键字的系统人员表')
    exit()
elif 'str_sign_in' not in locals().keys():
    print('[错误] 未找到文件名包含“签到”关键字的签到记录表')
    exit()
elif 'str_qc_personnel' not in locals().keys():
    print('[错误] 未找到文件名包含“质控人员”关键字的质控人员表')
    exit()

# ===输入质控人员源数据===
print('[操作] 处理质控人员数据')
# 输入调研用户数据
xlsx_qc_personnel = load_workbook(str_path_source_data + '\\' + str_qc_personnel, read_only=False)
sheet_qc_personnel = xlsx_qc_personnel.active

# 转换为DataFrame
df_qc_personnel = pd.DataFrame(sheet_qc_personnel.values)
# 设置字段名
df_qc_personnel.columns = df_qc_personnel.iloc
df_qc_personnel = df_qc_personnel.drop(0)

# 清洗无效行
df_qc_personnel = df_qc_personnel.drop(df_qc_personnel)].index)

# 创建质控人员字典
dict_qc_personnel = {}
for n in range(df_qc_personnel.shape):
    dict_qc_personnel] = df_qc_personnel['小组']

# ===输入签到源数据===
print('[操作] 处理签到数据')
# 输入调研用户数据
xlsx_sign_in = load_workbook(str_path_source_data + '\\' + str_sign_in, read_only=False)
sheet_sign_in = xlsx_sign_in.active

# 转换为DataFrame
df_sign_in = pd.DataFrame(sheet_sign_in.values)
# 设置字段名
df_sign_in.columns = df_sign_in.iloc
df_sign_in = df_sign_in.drop(0)

# 格式化日期
df_sign_in['打卡时间'] = pd.to_datetime(df_sign_in['打卡时间'])

# 新增[签到日期]列
df_sign_in['签到日期'] = df_sign_in.apply(lambda x: x['打卡时间'].strftime("%Y年%m月%d日"), axis=1)

# 获取关键字段,参加一个新DataFrame
df_sign_in_drop_duplicates = df_sign_in.loc[:, ['姓名', '签到日期']]
# 去重
df_sign_in_drop_duplicates = df_sign_in_drop_duplicates.drop_duplicates()
# 创建人员签到天数字典
dict_sign_in_days = dict(Counter(df_sign_in_drop_duplicates['姓名']))

# ===输入系统人员源数据===
print('[操作] 处理系统人员数据')
# 输入调研用户数据
xlsx_personnel = load_workbook(str_path_source_data + '\\' + str_personnel, read_only=False)
sheet_personnel = xlsx_personnel.active

# 转换为DataFrame
df_personnel = pd.DataFrame(sheet_personnel.values)
# 设置字段名
df_personnel.columns = df_personnel.iloc
df_personnel = df_personnel.drop(0)

# 清洗非家客人员
df_personnel = df_personnel.drop(df_personnel[~df_personnel['所属组织'].str.contains('家客')].index)

# 清洗离职人员
df_personnel = df_personnel.drop(df_personnel == '离职'].index)

# 获得人员分类
df_personnel['分类'] = df_personnel['所属组织'].apply(lambda x: func_get_class(x))

# 获得人员用工形式
df_personnel['用工形式'] = df_personnel['所属组织'].apply(lambda x: '兼职' if '支援' in x else '全职')

# 获得人员部门
df_personnel['部门'] = df_personnel.apply(lambda x: func_get_department(x), axis=1)

# 获得人员班组
df_personnel['班组'] = df_personnel.apply(lambda x: func_get_group(x), axis=1)

# 获得人员签到天数
df_personnel['签到天数'] = df_personnel.apply(lambda x: func_sign_in_Days(x), axis=1)

# 重置索引(index)
df_personnel = df_personnel.reset_index(drop=True)

# =====输出Excel文件=====
print('[操作] 输出Excel通报表')

# =====输出Excel文件=====
# 定义通报文件名
xlsx_notification = "通报.xlsx"
# 复制文件
os.popen('copy 通报模板.xlsx ' + xlsx_notification).read()
# 打开文件
bookResult = load_workbook(xlsx_notification)
# 删除原有数据
del bookResult['代维系统人员']
del bookResult['签到系统记录']
del bookResult['签到去重记录']

# 重命名通报标题
bookResult['通报']['B2'] = "阶段在途及归档情况通报"

print("[操作] 输出EXCEL文件")
writer = pd.ExcelWriter(xlsx_notification, engine='openpyxl')
writer.book = bookResult
df_personnel.to_excel(writer, sheet_name='代维系统人员', index=False)
df_sign_in.to_excel(writer, sheet_name='签到系统记录', index=False)
df_sign_in_drop_duplicates.to_excel(writer, sheet_name='签到去重记录', index=False)

writer.save()
writer.close()



chen4321 发表于 2021-1-18 08:33

lambda写的不规范吧,你看看错的几行都是lambda

firstharbor 发表于 2021-1-18 08:59

本帖最后由 firstharbor 于 2021-1-18 09:11 编辑

晕,复制下来运行还有数据类型报错:
[操作] 处理质控人员数据
Traceback (most recent call last):
File "F:/Program Files/python/1.py", line 111, in <module>
    xlsx_qc_personnel = load_workbook(str_path_source_data + '\\' + str_qc_personnel, read_only=False)
TypeError: must be str, not int
好吧,好像是因为我指定目录没文件,我调试下

firstharbor 发表于 2021-1-18 09:06

lambda 函数包含的表达式好像不能超过1个

xmy00000 发表于 2021-1-18 09:09

不建议使用lambda

lvcaolhx 发表于 2021-1-18 09:32

4楼正解。

andrew2018 发表于 2021-1-18 10:23

144行改成这个试试
df_sign_in['签到日期'] = df_sign_in['打卡时间'].apply(lambda x: x.strftime("%Y年%m月%d日"))

其他问题不懂了,等大神解答。
自己的理解,lambda 函数调用的是确定的值没有问题,在调用函数的话就会报错。
先把各函数运行之后的结果,添加到一列,然后在lambda 函数调用这个列的值。
个人理解,仅供参考。

cqwcns 发表于 2021-1-18 14:56

firstharbor 发表于 2021-1-18 09:06
lambda 函数包含的表达式好像不能超过1个

应该怎么改,可否具体指教一下,谢谢。

cqwcns 发表于 2021-1-18 14:57

xmy00000 发表于 2021-1-18 09:09
不建议使用lambda

应该怎么改,可否具体指教一下,谢谢。

cqwcns 发表于 2021-1-18 17:06

本帖最后由 cqwcns 于 2021-1-18 17:08 编辑

我发现这样写就不告警了,不影响功能实现。
但不知道这样写是否规范,或者有没有更好的写法。


# 获得人员部门
df_personnel['部门'] = df_personnel[['所属组织', '分类']].apply(func_get_department, axis=1)

# 获得人员班组
df_personnel['班组'] = df_personnel[['分类', '姓名', '部门', '所属组织']].apply(func_get_group, axis=1)

# 获得人员签到天数
df_personnel['签到天数'] = df_personnel[['姓名']].apply(func_sign_in_Days, axis=1)
页: [1] 2
查看完整版本: python,我去,PyCharm老是有不知道原因的警告,求解决方法