python - 在 R6 的初始化中调用 R6 类的函数

标签 python r oop r6

我正在尝试为其他数据科学家和数据分析师构建 R 中用于数据库连接样板编码的内部工具的引用实现

我们的软件开发人员在 python 中做了类似的东西:

class DataRepository:

    def __init__(self):
        if user is not None and account is not None and password is not None and warehouse is not None and role is not None and database is not None and schema is not None:
            self.ctx = snowflake.connector.connect(
                user=user,
                password=password,
                account=account,
                role=role,
                database=database,
                schema=schema,
                warehouse=warehouse,
                login_timeout=login_timeout,
                ocsp_fail_open=ocsp_fail_open
            )
        else:
            secret_str = self.get_secrets()

            self.ctx = snowflake.connector.connect(
                user=secret_str['user'],
                password=secret_str['password'],
                account=secret_str['account'],
                role=secret_str['role'],
                database=secret_str['database'],
                schema=secret_str['schema'],
                warehouse=secret_str['warehouse'],
                login_timeout=login_timeout,
                ocsp_fail_open=ocsp_fail_open
            )

    def get_secrets(self):
        my_session = boto3.session.Session(region_name=AWS_DEFAULT_REGION)
        client = my_session.client(
            service_name='secretsmanager',
            region_name=AWS_DEFAULT_REGION,
        )
        get_secret_value_response = client.get_secret_value(
            SecretId=SECRET_NAME
        )
        secret_str = json.loads(get_secret_value_response['SecretString'])
        return secret_str

我试图用 S3 重现这个:

DataRepository <-
  R6Class(
    classname = "DataRepository",
    public = list(
      ctx = NULL,
      secrets = NULL,
      initialize = function() {
        if (length(user) == 1 &
            length(account) == 1 & length(password) == 1
            &
            length(warehouse) == 1 &
            length(role) == 1 & length(database) == 1) {
          self$ctx <- dbConnect(
            odbc::odbc(),
            Driver = "SnowflakeDSIIDriver",
            Database = database,
            Uid = user,
            Pwd = password,
            Server = paste0(account, ".snowflakecomputing.com"),
            role = role
          )
        } else {
          secret_dict <- self$getSecrets()
          self$ctx <- dbConnect(
            odbc::odbc(),
            Driver = secret_dict$user,
            Database = secret_dict$database,
            Uid = secret_dict$user,
            Pwd = secret_dict$password,
            Server = paste0(secret_dict$account, ".snowflakecomputing.com"),
            role = secret_dict$account
          )
        }
      },
      getSecrets = function() {
        secrets_client <- paws::secretsmanager(config =
                                                 list(region = AWS_REGION))
        get_secret_value_response <- secrets_client$get_secret_value(SecretId = SECRETS_NAME)
        secrets_str <-
          get_secret_value_response$SecretString %>% fromJSON()
        return(secrets_str)
      }
    )
    
  )

但是,我似乎无法像我的同事在 python 中那样访问初始化程序中的 get_secrets 函数。

有什么简单的解决办法吗?

PS:我对 R6 系统不太熟悉,我相信我的困惑可能是由于概念错误,但我非常乐意了解更多:)

最佳答案

您的代码在 getSecrets 方面很好,但您忘记定义构造函数参数。

考虑一下:


DataRepository <-
  R6Class(
    classname = "DataRepository",
    public = list(
      ctx = NULL,
      secrets = NULL,
      initialize = function(user, account,password,warehouse,role,database) {
        if ( !missing(database) &&
            length(user) == 1 &&
            length(account) == 1 && length(password) == 1 &&
            length(warehouse) == 1 &&
            length(role) == 1 && length(database) == 1) {
          self$ctx <- dbConnect(
            odbc::odbc(),
            Driver = "SnowflakeDSIIDriver",
            Database = database,
            Uid = user,
            Pwd = password,
            Server = paste0(account, ".snowflakecomputing.com"),
            role = role
          )
        } else {
          secret_dict <- self$getSecrets()
          ## self$ctx <- dbConnect(
          ##   odbc::odbc(),
          ##   Driver = secret_dict$user,
          ##   Database = secret_dict$database,
          ##   Uid = secret_dict$user,
          ##   Pwd = secret_dict$password,
          ##   Server = paste0(secret_dict$account, ".snowflakecomputing.com"),
          ##   role = secret_dict$account
          ## )
        }
      },
      getSecrets = function() {
        cat( "I am in the getSecrets method!\n")
        ## secrets_client <- paws::secretsmanager(config =
        ##                                          list(region = AWS_REGION))
        ## get_secret_value_response <- secrets_client$get_secret_value(SecretId = SECRETS_NAME)
        ## secrets_str <-
        ##   get_secret_value_response$SecretString %>% fromJSON()
        ## return(secrets_str)
      }
    )
  )

dr = DataRepository$new()

输出:


> dr = DataRepository$new()
I am in the getSecrets method!

检查您的参数是否丢失(上面我只检查了最后一个,如果您仅执行位置参数,则该参数有效,对此没有保证),或者设置您有意义地处理的默认值,或者只是编写一个函数检查输入参数,如果它们不够,则返回 FALSE,您应该去获取 secret 。

也请使用双&符号,例如。 && 而不是 &,后者是一个矢量化 AND 运算符。此处应该只有一个值,如果不是这样,您会欢迎收到警告。

关于python - 在 R6 的初始化中调用 R6 类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66563146/

相关文章:

r - 生成具有最小距离的随机 x 和 y 坐标

oop - 如何使用 Playground/Workspace(而不是通过系统浏览器)创建方法?

c++ - 为什么通过公开继承另一个类来构建一个类是一种糟糕的做法?

c++ - 通过引用传递指针是执行此操作的正确方法吗?

python - Cython、CMake 和 setup.py、python 在子目录中编译两次

r - 在 R/ggplot2 中更改 True 和 False 的堆栈顺序

r - 在 Debian 8.2 上安装 R

python - Python 中的静态链接和动态链接分别是什么意思?

python - 如何测试对象是否为 pandas 日期时间索引?

python - tf.assign 到变量切片在 tf.while_loop 中不起作用