【问题标题】:Taking list of elements as param in Class method在 Class 方法中将元素列表作为参数
【发布时间】:2017-02-08 14:06:21
【问题描述】:

我有一个课程Dbcrud(),我将在下面概述。

我想从一个方法中获取几个参数:db_select() 一个是 selected_fields,这将是一个字段列表。

我无法形成我的方法db_select() 以允许为selected_fields 定义多个字段。

有人可以帮忙吗?

谢谢 更新

class DbCrud:
    query_stmt_list = ['SELECT','INSERT','UPDATE','DELETE','FROM','WHERE']
    def __init__(self):
        self.query_stmt_list = DbCrud.query_stmt_list

    self.query_stmt_list = query_stmt_list

    def set_db_settings(self, host, username, passwd, database):
        self.host = host
        self.username = username
        self.passwd = passwd
        self.database = database
        db = pymysql.connect(host=host, user=username, passwd=passwd, db=database)
        return db
    def db_select(self, selected_fields, table, where_field):
        self.selected_fields = selected_fields
        self.table = table
        self.where_field = where_field
        try:
            with db.cursor() as cursor:
                sql_tld_id_query = self.query_stmt_list[0] + selected_fields* + self.query_stmt_list[4] + table + self.query_stmt_list[5] + where_field + '=' + %s
                cursor.execute(sql_tld_id_query, (self.site_search_url,))
                tld_id_value = cursor.fetchone() 
        except:
            db.rollback()
            pass 

【问题讨论】:

  • 你有一个语法问题selected_fields[]不能作为函数的参数,你需要调用它selected_fields,这个参数可以是任何你喜欢的。你还需要在__init__方法中定义self.query_stmt_list = query_stmt_list
  • 你有一个语法错误,你没有在 Python 中以任何方式指明变量的类型,除非你使用了类型注解。它应该是selected_fields,没有尾随[]。如果您想出于文档目的显示其列表,可以使用selected_fields: List[Any],但您必须在文件顶部添加from typing import List, Any

标签: python list python-3.x class methods


【解决方案1】:

你有几个问题:

1. 您需要在 init 方法中使用该行(因为这是该类的 c'tor) 另外query_stmt_list是一个静态成员,你应该以类名作为前缀访问他。

def __init__(self):    
    self.query_stmt_list = DbCrud.query_stmt_list

2. 你不能用selected_fields[]定义函数参数,这是一个语法错误,你可以随意传递给selected_fields

def db_select(self, selected_fields, table, where_field):

3. 当您尝试使用变量query_stmt_list(在我附加的以下代码行)时,您的意思是您想要类成员还是实例成员?

如果是实例你应该把它改成self.query_stmt_list

如果是类成员,应该改成DbCrud.query_stmt_list

sql_tld_id_query = query_stmt_list[0] + selected_fields* + query_stmt_list[4] + table + query_stmt_list[5] + where_field + '=' + %s

另外,为了循环 selected_fields 你可以这样做:

query_stmt_list[0] + ", ".join(item for item in self.selected_fields) + query_stmt_list[4] ...

【讨论】:

  • @omri_saadon- 你能看到更新了吗?这看起来怎么样?我对课程较新(如帖子中所示),并希望获得您的反馈。想法?
【解决方案2】:

您总是可以期望selected_fields 是一个列表,因此您可以使用', '.join

def db_select(self, selected_fields, table, where_field):
    query = 'select {selected_fields} {table} where {where_field} = 1'
    query = query.format(selected_fields=', '.join(selected_fields),
                         table=table, where_field=where_field)
    .
    .

obj.db_select(['col_a'], 'table_a', 'where_field_a')

请注意,这很容易受到 SQL 注入的影响,但您的原始代码也是如此(如果不是因为它当前存在的语法错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多