鱼C论坛

 找回密码
 立即注册
查看: 3010|回复: 14

[已解决]如何判断字符串是不是键值对

[复制链接]
发表于 2022-11-30 15:17:49 | 显示全部楼层 |阅读模式

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

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

x
如题
最佳答案
2022-12-8 21:02:49
Mefine 发表于 2022-11-30 16:13
比如下面这种程序,我还需要判断传入参数如果是字符串,那么是不是键值对,如何去判断

我理解的是你要传入的val参数必须是 字符串(str) 或者 字典(dict) 类型吧
@data.setter
    def data(self, va1):
       if type(val) != dict and type(val) != str :
           return '值必须是字典或字符串'            
       self.__data = val
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-30 15:22:27 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-30 15:23 编辑

          说清楚,是什么东西用的键值对?你举一个这样字符串的例子看看呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-30 16:13:49 | 显示全部楼层
本帖最后由 Mefine 于 2022-11-30 16:31 编辑
jackz007 发表于 2022-11-30 15:22
说清楚,是什么东西用的键值对?你举一个这样字符串的例子看看呢


比如下面这种程序,我还需要判断传入参数如果是字符串,那么是不是键值对,如何去判断
class Testdemo(object):
    def __init__(self,data):
        self.__data = data
        # self.__params = params
        # self.__method = method
        # self.__url = url
        # self.__headers = headers
        # self.__json = json
        # self.__files = files

    @property
    def data(self):
        return self.__data

    @data.setter
    def data(self, va1):
        if type(va1) is not dict or str:
            print('必须是字典或字符串')
            return
        self.__data = va1

obj1 = Testdemo({"a": "1", "b": "2"})
print(obj1.data)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-30 17:17:05 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-30 17:18 编辑

        这种类装饰器暂时属于本人知识盲区,无法发表意见,但是,这个语句肯定存在问题:
if type(va1) is not dict or str:
        应该改为
if type(va1) != dict and type(va1) != str :
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-30 18:23:50 | 显示全部楼层
jackz007 发表于 2022-11-30 17:17
这种类装饰器暂时属于本人知识盲区,无法发表意见,但是,这个语句肯定存在问题:

        应该 ...

明白,语句判断确实写的有点问题。。谢谢~

主要问题还是在于if语句如何判断给定字符串是否是键值对,这个不知道怎么判断。。求大佬解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-30 18:29:34 | 显示全部楼层
Mefine 发表于 2022-11-30 18:23
明白,语句判断确实写的有点问题。。谢谢~

主要问题还是在于if语句如何判断给定字符串是否是键值对, ...

          难道用 type() 判断对象类型还不够用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-30 18:34:58 | 显示全部楼层
jackz007 发表于 2022-11-30 18:29
难道用 type() 判断对象类型还不够用?

就是不确定够不够用,在小甲鱼的速查宝典看了type基本用法:
>>> # 第一种用法
>>> type(250)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("FishC")
<class 'str'>
>>> class C:
...     def __init__(self, x):
...         self.x = x
...
>>> c = C(250)
>>> c
<__main__.C object at 0x0000025724952FD0>
>>> d = type(c)(520)
>>> d
<__main__.C object at 0x0000025724952C70>
>>> # 第二种用法
>>> C = type('C', (), {})
>>> c = C()
>>> c
<__main__.C object at 0x0000026EFD5C2DC0>
>>> D = type('D', (C,), dict(x=250))
>>> D.__bases__
(<class '__main__.C'>,)
>>> D.x
250
>>> def funC(self, name="FishC"):
...     print(f"Hello {name}")
...
>>> E = type('E', (), dict(say_hi=funC))
>>> e = E()
>>> e.say_hi()
Hello FishC
>>> e.say_hi("小甲鱼")
Hello 小甲鱼

还是没能理解,怎么判断字符串是不是键值对。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-30 19:15:47 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-11-30 20:02 编辑

你是在做那个"选做题"吧~?   如果是,那么具体场景应该是 处理request的字符串数据,

这包括GET的params的query-string形式,和POST的data字符串形式(其实也是类似query-string的形式)等

所以,我举个例子吧,大概应该是这样(你改成pytest的测试用例那样的test_xxx,该改的则改,"能跑就行" ^_ ):
class Request:
    def __init__(self, method='GET', url='/'):
        self._method = method 
        self._url = url 
        self._params = None 
    
    @property
    def method(self):
        return self._method.lower()
    
    @method.setter
    def method(self, value):
        self._method = value
    
    @property
    def url(self):
        return self._url.lstrip('/') 
    
    @url.setter
    def url(self, url):
        self._url = url 
    
    @property
    def params(self):
        return self._params if self._params else None 
    
    @params.setter
    def params(self, params=None):
        if params is None:
            self._params = dict()
        else:
            if isinstance(params, dict):
                self._params = params
            elif isinstance(params, str):
                '''like the Query-String: /search?id=1001&name=Alice '''
                kv = params[params.find('?')+1:].split('&')
                self._params = {i.split('=')[0] : i.split('=')[1] for i in kv}
        

    
req = Request()
print('url: ', req.url)
print('Method: ', req.method)
print('params: ', req.params) 


req.url = '/search?id=1001&name=Alice'   # query-string 
print('url: ', req.url)
print('Method: ', req.method)
print('params: ', req.params) 

# req.data = '/register?name=Alice&password=123456'   # POST的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-1 19:01:41 | 显示全部楼层
是val.keys()和val.values()意思么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-8 17:56:58 | 显示全部楼层
cflying 发表于 2022-12-1 19:01
是val.keys()和val.values()意思么

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

使用道具 举报

发表于 2022-12-8 18:03:03 | 显示全部楼层
啥意思哦?比如判断 "'x': 1, 'y': 2" 是不是键值对的形式?能给个例子吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-8 18:40:00 | 显示全部楼层
class Request:
    def init(self):
        self.data = None

    @property
    def data(self):
        return self.data

    @data.setter
    def data(self, value):
        if isinstance(value, dict):
            self.data = value
        elif isinstance(value, str):
            try:
                self.data = dict(item.split(":") for item in value.split(","))
            except ValueError:
                self.data = value
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-8 18:40:52 | 显示全部楼层
hrpzcf 发表于 2022-12-8 18:03
啥意思哦?比如判断 "'x': 1, 'y': 2" 是不是键值对的形式?能给个例子吗?

应该是包含“:”和“,”的都是键值对吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-8 19:25:11 | 显示全部楼层
搞这么麻烦干啥,直接用eval函数执行字符串语句,如果是字典格式的,type()就是dict,用个if判断搞一下
a="{'1':[1,2,3],'2':[4,5,6]}"
type(a)
<class 'str'>
b=eval(a)
type(b)
<class 'dict'>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-8 21:02:49 | 显示全部楼层    本楼为最佳答案   
Mefine 发表于 2022-11-30 16:13
比如下面这种程序,我还需要判断传入参数如果是字符串,那么是不是键值对,如何去判断

我理解的是你要传入的val参数必须是 字符串(str) 或者 字典(dict) 类型吧
@data.setter
    def data(self, va1):
       if type(val) != dict and type(val) != str :
           return '值必须是字典或字符串'            
       self.__data = val
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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