wnhuiyou 发表于 2020-9-18 09:46:12

怎么转成普通变量?

我有这么一个需求,

原函数代码
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')

但是这样会报错,因为不支持字符串,有什么其他的办法吗?

bonst 发表于 2020-9-18 10:22:52

你试试修改为tt='tui_id=1'看看行不

suchocolate 发表于 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)

sunrise085 发表于 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)

wnhuiyou 发表于 2020-9-18 10:37:55

bonst 发表于 2020-9-18 10:22
你试试修改为tt='tui_id=1'看看行不

这样是的可以但是传过去还是字符串这么把 'tui_id=1'传过去不带引号

wnhuiyou 发表于 2020-9-18 10:38:32

suchocolate 发表于 2020-9-18 10:23


这样是没问题的,但是 tui__id 这个变量不是固定的 是可变的

wnhuiyou 发表于 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

wnhuiyou 发表于 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')


或者怎么用正则表达式 去除那个单引号, 我把单引号写在里面 没有效果

bonst 发表于 2020-9-18 10:43:30

再加一个中间变量,令char = str(input('请输入你要的变量'))
index(tt=char)

bonst 发表于 2020-9-18 10:44:20

思路是这样的,至于char内的内容哪里来就自己决定了,输入也好,其他方式传入也好

wnhuiyou 发表于 2020-9-18 10:58:46

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

可以 但是 remen = Article.objects.filter(tt)   不支持字符串要把单引号去掉

wnhuiyou 发表于 2020-9-18 11:04:19

sunrise085 发表于 2020-9-18 10:24
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
改为


而且 remen = Article.objects.filter(tt)里面的 tt 不支持字符串的

bonst 发表于 2020-9-18 11:10:43

你把强制字符串str去掉试试

sunrise085 发表于 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)

sunrise085 发表于 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')#这里传进去的是字符串

wnhuiyou 发表于 2020-9-18 12:02:49

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

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

开始是这样的 这没有报错


这是我按照你的方式修改的


Stubborn 发表于 2020-9-18 12:11:36

楼主要搞明白一个问题

function (obj=None)

默认调用,不传参数

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

你推荐文章,应该按照一个推荐指数去推荐,文章排序,按照这个升序降序。那么多花里胡哨

永恒的蓝色梦想 发表于 2020-9-18 13:36:05

sunrise085 发表于 2020-9-18 10:24
你是要修改index函数让其能够识别传递过来的tt参数吗?
可以试试将
改为


你这就是传个 None 啊

sunrise085 发表于 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()=int(b) # 这里把 tui__id 作为变量名保存了
    print(tui__id) # 这里可以打印出来该变量
    fun2(tui__id=tui__id) # 括号内两个 tui__id ,前者是关键字参数形参,后者是变量,但是等号前面这个不知道该怎么获得

fun('tui__id=1')


sunrise085 发表于 2020-9-18 14:17:18

永恒的蓝色梦想 发表于 2020-9-18 13:36
你这就是传个 None 啊

是的,弄明白问题出在哪儿了
页: [1] 2
查看完整版本: 怎么转成普通变量?