【问题标题】:using python `eval()` with a method使用带有方法的 python `eval()`
【发布时间】:2023-03-28 15:55:01
【问题描述】:

我的最终目标是在嵌套的for 循环中获取今天和昨天两天的日、月和年。

下面我正在导入东西并定义todayyesterday

import datetime as dt
from datetime import timedelta 
today = dt.date.today()
yesterday = today - timedelta(1)

现在我正在定义一个字典来映射每年、每月和每天的格式

d_day_format = {'year': '%y',
                'month': '%m',
                'day': '%d'}

所以现在我想创建以下变量:today_year (20)、today_month (12)、today_day (31)、yesterday_year (20)、yesterday_month (12) 和 @987654331 @ (30)

我正在使用eval()从字符串中获取变量的值,如下循环所示

for d in 'today yesterday'.split():
    for k in d_day_format.keys():
        globals()[f"{d}_{k}"] = eval(d).eval(k).format(f"{d_day_format[k]}") 

变量赋值eval(d) 的第一部分有效,但似乎我不能将eval() 用于方法:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
~/installed/python/demuxDelayer/demuxDelayer_v2.py in <module>
      1 for d in 'today yesterday'.split():
      2     for k in d_day_format.keys():
----> 3         globals()[f"{d}_{k}"] = eval(d).eval(k).format(f"{d_day_format[k]}")

AttributeError: 'datetime.date' object has no attribute 'eval'

有谁知道如何解决这个问题?

【问题讨论】:

  • 您希望在第一个 eval 调用返回的对象上使用 getattr 而不是 eval。不过,您甚至不需要第一个 eval 电话。您基本上是在使用eval 进行字典查找,这对于该任务来说是多余的。将对象放入字典而不是使用松散变量,然后进行典型的查找。

标签: python-3.x dictionary datetime for-loop


【解决方案1】:

Python 的 eval() 允许您从基于字符串或基于编译代码的输入计算任意 Python 表达式。当您尝试从作为字符串或编译代码对象的任何输入动态评估 Python 表达式时,此函数会很方便。在这种情况下,您将问题过度复杂化。这就是我将如何完成你想要的。

import datetime as dt
from datetime import timedelta 
today = dt.date.today()
yesterday = today + timedelta(days=-1)  #Note changed from your original
cntl_dict={'year':'year%100', 'month':'month', 'day':'day'}
inrecord = {'today':today, 'yesterday':yesterday}
for k, v in inrecord.items():
    for l, w in cntl_dict.items():
        print(f'{k}-{l}: {eval(f"{k}.{w}")}')

产量:

today_year': 20
today_month': 12
today_day': 31
yesterday_year': 20
yesterday_month': 12
yesterday_day': 30

【讨论】:

  • 感谢您的回复,尽管我正在尝试迭代构建输出,即在循环中,而不是手动键值分配
  • 您能否进一步详细说明您要做什么?从您的描述中不清楚您所说的没有手动键值分配是什么意思。
  • 我刚刚更新了我的答案以迭代地构建输出。
猜你喜欢
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 2018-12-02
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多