鱼C论坛

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

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

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

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

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

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

我理解的是你要传入的val参数必须是 字符串(str) 或者 字典(dict) 类型吧
  1. @data.setter
  2.     def data(self, va1):
  3.        if type(val) != dict and type(val) != str :
  4.            return '值必须是字典或字符串'            
  5.        self.__data = val
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

          说清楚,是什么东西用的键值对?你举一个这样字符串的例子看看呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  10.     @property
  11.     def data(self):
  12.         return self.__data

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

  19. obj1 = Testdemo({"a": "1", "b": "2"})
  20. print(obj1.data)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        这种类装饰器暂时属于本人知识盲区,无法发表意见,但是,这个语句肯定存在问题:
  1. if type(va1) is not dict or str:
复制代码

        应该改为
  1. if type(va1) != dict and type(va1) != str :
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        应该 ...

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

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

使用道具 举报

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

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

          难道用 type() 判断对象类型还不够用?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

就是不确定够不够用,在小甲鱼的速查宝典看了type基本用法:
  1. >>> # 第一种用法
  2. >>> type(250)
  3. <class 'int'>
  4. >>> type(3.14)
  5. <class 'float'>
  6. >>> type("FishC")
  7. <class 'str'>
  8. >>> class C:
  9. ...     def __init__(self, x):
  10. ...         self.x = x
  11. ...
  12. >>> c = C(250)
  13. >>> c
  14. <__main__.C object at 0x0000025724952FD0>
  15. >>> d = type(c)(520)
  16. >>> d
  17. <__main__.C object at 0x0000025724952C70>
  18. >>> # 第二种用法
  19. >>> C = type('C', (), {})
  20. >>> c = C()
  21. >>> c
  22. <__main__.C object at 0x0000026EFD5C2DC0>
  23. >>> D = type('D', (C,), dict(x=250))
  24. >>> D.__bases__
  25. (<class '__main__.C'>,)
  26. >>> D.x
  27. 250
  28. >>> def funC(self, name="FishC"):
  29. ...     print(f"Hello {name}")
  30. ...
  31. >>> E = type('E', (), dict(say_hi=funC))
  32. >>> e = E()
  33. >>> e.say_hi()
  34. Hello FishC
  35. >>> e.say_hi("小甲鱼")
  36. Hello 小甲鱼
复制代码


还是没能理解,怎么判断字符串是不是键值对。。
小甲鱼最新课程 -> https://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,该改的则改,"能跑就行" ^_ ):
  1. class Request:
  2.     def __init__(self, method='GET', url='/'):
  3.         self._method = method
  4.         self._url = url
  5.         self._params = None
  6.    
  7.     @property
  8.     def method(self):
  9.         return self._method.lower()
  10.    
  11.     @method.setter
  12.     def method(self, value):
  13.         self._method = value
  14.    
  15.     @property
  16.     def url(self):
  17.         return self._url.lstrip('/')
  18.    
  19.     @url.setter
  20.     def url(self, url):
  21.         self._url = url
  22.    
  23.     @property
  24.     def params(self):
  25.         return self._params if self._params else None
  26.    
  27.     @params.setter
  28.     def params(self, params=None):
  29.         if params is None:
  30.             self._params = dict()
  31.         else:
  32.             if isinstance(params, dict):
  33.                 self._params = params
  34.             elif isinstance(params, str):
  35.                 '''like the Query-String: /search?id=1001&name=Alice '''
  36.                 kv = params[params.find('?')+1:].split('&')
  37.                 self._params = {i.split('=')[0] : i.split('=')[1] for i in kv}
  38.         

  39.    
  40. req = Request()
  41. print('url: ', req.url)
  42. print('Method: ', req.method)
  43. print('params: ', req.params)


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

  48. # req.data = '/register?name=Alice&password=123456'   # POST的
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-1 19:01:41 | 显示全部楼层
是val.keys()和val.values()意思么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不是哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

  4.     @property
  5.     def data(self):
  6.         return self.data

  7.     @data.setter
  8.     def data(self, value):
  9.         if isinstance(value, dict):
  10.             self.data = value
  11.         elif isinstance(value, str):
  12.             try:
  13.                 self.data = dict(item.split(":") for item in value.split(","))
  14.             except ValueError:
  15.                 self.data = value
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

应该是包含“:”和“,”的都是键值对吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-8 19:25:11 | 显示全部楼层
搞这么麻烦干啥,直接用eval函数执行字符串语句,如果是字典格式的,type()就是dict,用个if判断搞一下

  1. a="{'1':[1,2,3],'2':[4,5,6]}"
  2. type(a)
  3. <class 'str'>
  4. b=eval(a)
  5. type(b)
  6. <class 'dict'>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我理解的是你要传入的val参数必须是 字符串(str) 或者 字典(dict) 类型吧
  1. @data.setter
  2.     def data(self, va1):
  3.        if type(val) != dict and type(val) != str :
  4.            return '值必须是字典或字符串'            
  5.        self.__data = val
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 13:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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