Merge pull request #4539 from pabloem/static-runtimevalueprovider

[BEAM-3570] Adding a static getter for RuntimeValueProvider.
diff --git a/sdks/python/apache_beam/options/value_provider.py b/sdks/python/apache_beam/options/value_provider.py
index 291440d..09b4a44 100644
--- a/sdks/python/apache_beam/options/value_provider.py
+++ b/sdks/python/apache_beam/options/value_provider.py
@@ -78,17 +78,22 @@
   def is_accessible(self):
     return RuntimeValueProvider.runtime_options is not None
 
+  @classmethod
+  def get_value(cls, option_name, value_type, default_value):
+    candidate = RuntimeValueProvider.runtime_options.get(option_name)
+    if candidate:
+      return value_type(candidate)
+    else:
+      return default_value
+
   def get(self):
     if RuntimeValueProvider.runtime_options is None:
       raise error.RuntimeValueProviderError(
           '%s.get() not called from a runtime context' % self)
 
-    candidate = RuntimeValueProvider.runtime_options.get(self.option_name)
-    if candidate:
-      value = self.value_type(candidate)
-    else:
-      value = self.default_value
-    return value
+    return RuntimeValueProvider.get_value(self.option_name,
+                                          self.value_type,
+                                          self.default_value)
 
   @classmethod
   def set_runtime_options(cls, pipeline_options):
diff --git a/sdks/python/apache_beam/runners/worker/operations.py b/sdks/python/apache_beam/runners/worker/operations.py
index 8a072e8..3eecae0 100644
--- a/sdks/python/apache_beam/runners/worker/operations.py
+++ b/sdks/python/apache_beam/runners/worker/operations.py
@@ -288,8 +288,8 @@
     assert self.side_input_maps is None
 
     # Get experiments active in the worker to check for side input metrics exp.
-    experiments = set(RuntimeValueProvider(
-        'experiments', str, '').get().split(','))
+    experiments = set(
+        RuntimeValueProvider.get_value('experiments', str, '').split(','))
 
     # We will read the side inputs in the order prescribed by the
     # tags_and_types argument because this is exactly the order needed to
diff --git a/sdks/python/apache_beam/runners/worker/sideinputs.py b/sdks/python/apache_beam/runners/worker/sideinputs.py
index 8b7e14e..cc405e0 100644
--- a/sdks/python/apache_beam/runners/worker/sideinputs.py
+++ b/sdks/python/apache_beam/runners/worker/sideinputs.py
@@ -106,7 +106,7 @@
   def _reader_thread(self):
     # pylint: disable=too-many-nested-blocks
     experiments = set(
-        RuntimeValueProvider('experiments', str, '').get().split(','))
+        RuntimeValueProvider.get_value('experiments', str, '').split(','))
     try:
       while True:
         try: