【问题标题】:Using variable to get list from imported module使用变量从导入的模块中获取列表
【发布时间】:2021-01-26 01:17:56
【问题描述】:

我正在尝试制作一个脚本,其中我的缩放类将根据时间表自动打开。

我制作了一个名为 schedule 的模块,其中包含每个工作日例程的单独列表。

在主文件中,我制作了一个字典,其中键是我们使用 datetime.today().weekday() 后得到的整数值,值是其对应的工作日名称,例如 {0:monday}

在我的函数中,如果今天的工作日整数值与字典键匹配,那么它将从调度模块调用其对应的工作日值。但是当我运行它时,它说“AttributeError: module 'schedule' has no attribute 'value'”

这是我的部分代码供参考

#Monday=0, Tuesday=1 , Wednesday=2, Thursday=3, Sun=6.
weekday = {'1':'tuesday',
       '2':'wednesday',
       '3':'thursday',
       '6':'sunday',
       '0':'monday'}
#Function for opening and closing link in webbrowser.
def open_webbrowser():
global activation
day = datetime.today().weekday()
for key, value in weekday.items():
    if int(key) == day:
        for i in schedule.value:...

这是日程安排模块。我用'zoomlink'替换了原始链接

#Class routine.
sunday = [
[zoomlink,'09:01','09:39'],
[zoomlink,'10:01','10:39'],
[zoomlink,'11:01','11:39'],
[zoomlink,'12:01','12:39']
]
monday = [...]
tuesday = [...]
wednesday = [...]
thursday = [...]

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    以下部分,

    for i in schedule.value:...
    

    替换为,

    for i in getattr(schedule, value):...
    

    它应该工作。这就是原因,在 for 循环中,您将得到 valuetuesdaywednesdaythursdaysundaymonday,它是一个字符串。因此,如果您像schedule.tuesday 一样访问它,那么它绝对应该可以工作。但不幸的是,您正在访问schedule.valuevalue 也是一个变量,并且在调度模块中没有名为value 的属性。因此,最简单和更 Pythonic 的解决方案之一是使用getattr()。我从What is getattr() exactly and how do I use it? 中提取了answer 下面的问题。

    getattr(object, 'x') 完全等价于 object.x。

    只有两种情况 getattr 有用。

    • 你不能写object.x,因为你事先不知道你想要哪个属性(它来自一个字符串)。对于元编程非常有用。
    • 您想提供一个默认值。如果没有 y,object.y 将引发 AttributeError。但是 getattr(object, 'y', 5) 将返回 5。

    现在您将更好地了解如何使用getattr() 函数,有关更多信息,请查看官方文档或我之前提到的问题。

    【讨论】:

    • 不客气@m4rk_Henry_ftw,刚刚更新了我的答案以了解更多关于您做错了什么以及解决这种情况的pythonic方法。如果您没有得到任何意见或需要了解任何信息,请随时在下方发表评论,我们很乐意为您提供帮助!
    【解决方案2】:

    您的代码无法正常工作的原因是,schedule.value 试图在 schedule 模块中获取一个名为 value 的变量,而您的本意是让它扩展为 schedule.sunday 之类的东西。

    解决此问题的一种方法是将列表封装在字典中,您可以在字典中使用字符串索引(例如“sunday”或“monday”)访问列表。如果您要这样做,您的日程安排模块将如下所示:

    zoomLinkData = {
        "sunday": [
            [zoomlink,'09:01','09:39'],
            [zoomlink,'10:01','10:39'],
            [zoomlink,'11:01','11:39'],
            [zoomlink,'12:01','12:39']
        ],
        "monday": [...],
        "...": [...]
    }
    

    为了在循环中访问此字典中的数据,您可以这样做:

    for key, value in weekday.items():
        if int(key) == day:
            for i in schedule.zoomLinkData[value]:...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2018-01-09
      • 2019-02-27
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多