鱼C论坛

 找回密码
 立即注册
查看: 3258|回复: 28

[已解决]怎么转成普通变量?

[复制链接]
发表于 2020-9-18 09:46:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有这么一个需求,

原函数代码
def index(request):
        remen = Article.objects.filter(tui__id=1)

因为 remen = Article.objects.filter(tui__id=1) 里面的 tui__id=1 有时候会经常变,而且又不能是字符串,我的想法是 怎么通过如下方式来传递


def index(request, tt):
        remen = Article.objects.filter(tt)


index('tui__id=1')

但是这样会报错,因为不支持字符串,有什么其他的办法吗?
最佳答案
2020-9-18 16:48:26
sunrise085 发表于 2020-9-18 14:17
是的,弄明白问题出在哪儿了

为什么不试试把等号字符串解析成字典 然后fun(**字典)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-18 10:22:52 | 显示全部楼层
你试试修改为tt='tui_id=1'看看行不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 10:23:56 | 显示全部楼层
本帖最后由 suchocolate 于 2020-9-18 10:27 编辑
def index(request, tt):
        remen = Article.objects.filter(tui__id=tt)

index(1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 10:24:05 | 显示全部楼层
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
remen = Article.objects.filter(tt)  
改为
remen = Article.objects.filter(exec(tt))
这样当你调用 index('tui__id=1') 的时候,在index函数中执行的就是  remen = Article.objects.filter(tui__id=1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 10:37:55 | 显示全部楼层
bonst 发表于 2020-9-18 10:22
你试试修改为tt='tui_id=1'看看行不

这样是的可以  但是传过去还是字符串  这么把 'tui_id=1'  传过去不带引号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 10:38:32 | 显示全部楼层

这样是没问题的,但是 tui__id 这个变量不是固定的 是可变的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 10:40:33 | 显示全部楼层
sunrise085 发表于 2020-9-18 10:24
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
改为


不行, 我做了个测试
def rr(tt):

    print(exec(tt))

rr('tui_id=1')
返回结果是None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 10:43:30 | 显示全部楼层
sunrise085 发表于 2020-9-18 10:24
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
改为
import re


def rr(tt):
    tt = re.findall(r"'(.+?)'", tt)
    print(tt)
    print(type(tt))


rr(tt='tui_id=1')

或者怎么用正则表达式 去除那个单引号, 我把单引号写在里面 没有效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 10:43:30 | 显示全部楼层
再加一个中间变量,令
char = str(input('请输入你要的变量'))
index(tt=char)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 10:44:20 | 显示全部楼层
思路是这样的,至于char内的内容哪里来就自己决定了,输入也好,其他方式传入也好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 10:58:46 | 显示全部楼层
bonst 发表于 2020-9-18 10:44
思路是这样的,至于char内的内容哪里来就自己决定了,输入也好,其他方式传入也好

可以 但是 remen = Article.objects.filter(tt)   不支持字符串  要把单引号去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 11:04:19 | 显示全部楼层
sunrise085 发表于 2020-9-18 10:24
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
改为

而且 remen = Article.objects.filter(tt)  里面的 tt 不支持字符串的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 11:10:43 | 显示全部楼层
你把强制字符串str去掉试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 11:14:28 | 显示全部楼层
本帖最后由 sunrise085 于 2020-9-18 11:26 编辑
wnhuiyou 发表于 2020-9-18 11:04
而且 remen = Article.objects.filter(tt)  里面的 tt 不支持字符串的


我给你写的那个你试了吗?
exec作用就是将字符串当做式子执行
你试一下下面这个例子
string="print('I Love FishC')"
exec(string)

string2="1+2+3+4"
print(exec(string2))

exec("alf='abcdefg'")
print(alf)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 11:23:53 | 显示全部楼层
wnhuiyou 发表于 2020-9-18 10:43
或者怎么用正则表达式 去除那个单引号, 我把单引号写在里面 没有效果

请把你的问题描述清楚。
第一,调用的时候回事怎么调用,实参是什么形式?
第二,在函数内的时候形参想要以什么形式使用?

我的理解是你的实参是一个字符串,字符串的内容是一个表达式,例如:'tui_id=1'这是实参,是一个字符串,该字符串的内容是一个表达式 tui_id=1。你在函数内的时候,需要使用的是这个表达式,而不是这个字符串。
如果我理解的对的话,那么应该就是这样使用
def index(request, tt):
    # tt是字符串 'tui__id=1',但是下面要使用的是字符串的内容 tui__id=1 , 而非字符串本身
    remen = Article.objects.filter(exec(tt)) # 这样写实际上执行的是remen = Article.objects.filter(tui__id=1) 

index('tui__id=1')#这里传进去的是字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-18 12:02:49 | 显示全部楼层
sunrise085 发表于 2020-9-18 11:23
请把你的问题描述清楚。
第一,调用的时候回事怎么调用,实参是什么形式?
第二,在函数内的时候形参想 ...

对,你理解没错,就是这个意思,但我按照你说的做 还是出错

开始是这样的 这没有报错
微信截图_20200918115921.png

这是我按照你的方式修改的
微信截图_20200918120126.png

微信截图_20200918120056.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 12:11:36 | 显示全部楼层
楼主要搞明白一个问题

function (obj=None)

默认调用,不传参数

调用 func ( obj ) ->这里是传引用的值 例如 obj = 1 , 那么调用是这样的  func( obj=1 ) , 如果你想的 obj = 'id=1',  func( obj= 'id=1' ) , 参数位置在内部已经固定。

你推荐文章,应该按照一个推荐指数去推荐,文章排序,按照这个升序降序。那么多花里胡哨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 13:36:05 | 显示全部楼层
sunrise085 发表于 2020-9-18 10:24
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
改为

你这就是传个 None 啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 14:16:32 | 显示全部楼层
wnhuiyou 发表于 2020-9-18 12:02
对,你理解没错,就是这个意思,但我按照你说的做 还是出错

开始是这样的 这没有报错

呃,好吧。我搞错了

现在我发现我错的原因了
exec是直接将字符串当做表达式执行,得到的是表达式执行的结果,而非表达式本身

我尝试了exec,globals()等,还是没成功。
用globals()可以把tui__id添加到变量列表中去,但是还是无法在调用的时候得知该变量的名字。
看看下面这个小例子,我只能想到这里了。问题没解决,但愿能给你思路吧
def fun2(*arg,tui__id):
    if tui__id==1:
        print("flag is True")
    else:
        print("flag is False")
def fun(tt):
    a,b=tt.split('=')
    globals()[a]=int(b) # 这里把 tui__id 作为变量名保存了
    print(tui__id) # 这里可以打印出来该变量
    fun2(tui__id=tui__id) # 括号内两个 tui__id ,前者是关键字参数形参,后者是变量,但是等号前面这个不知道该怎么获得

fun('tui__id=1')

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-18 14:17:18 | 显示全部楼层

是的,弄明白问题出在哪儿了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 12:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表