Mefine 发表于 2022-11-30 15:17:49

如何判断字符串是不是键值对

如题

jackz007 发表于 2022-11-30 15:22:27

本帖最后由 jackz007 于 2022-11-30 15:23 编辑

          说清楚,是什么东西用的键值对?你举一个这样字符串的例子看看呢

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

jackz007 发表于 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 :

Mefine 发表于 2022-11-30 18:23:50

jackz007 发表于 2022-11-30 17:17
这种类装饰器暂时属于本人知识盲区,无法发表意见,但是,这个语句肯定存在问题:

      应该 ...

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

主要问题还是在于if语句如何判断给定字符串是否是键值对,这个不知道怎么判断。。求大佬解惑{:10_319:}

jackz007 发表于 2022-11-30 18:29:34

Mefine 发表于 2022-11-30 18:23
明白,语句判断确实写的有点问题。。谢谢~

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

          难道用 type() 判断对象类型还不够用?

Mefine 发表于 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 小甲鱼

还是没能理解,怎么判断字符串是不是键值对。。

阿奇_o 发表于 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.split('&')
                self._params = {i.split('=') : i.split('=') 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的

cflying 发表于 2022-12-1 19:01:41

是val.keys()和val.values()意思么

Mefine 发表于 2022-12-8 17:56:58

cflying 发表于 2022-12-1 19:01
是val.keys()和val.values()意思么

不是哦

hrpzcf 发表于 2022-12-8 18:03:03

啥意思哦?比如判断 "'x': 1, 'y': 2" 是不是键值对的形式?能给个例子吗?

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

Mefine 发表于 2022-12-8 18:40:52

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

应该是包含“:”和“,”的都是键值对吧?

lassiter 发表于 2022-12-8 19:25:11

搞这么麻烦干啥,直接用eval函数执行字符串语句,如果是字典格式的,type()就是dict,用个if判断搞一下

a="{'1':,'2':}"
type(a)
<class 'str'>
b=eval(a)
type(b)
<class 'dict'>

lxping 发表于 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
页: [1]
查看完整版本: 如何判断字符串是不是键值对